Пример #1
0
void StackTest(threadParam param)
{
	float workperthread = HEIGHT / (NUM_THREADS); //Aslong as HEIGHT == WIDTH this will work
	float threadStartPos = workperthread * param.id;
	MemStack* stack = param.al_the_croc->CreateStack(56, 4, false);
	if(param.customAllocation)
		Mandelbrot(param.stack, threadStartPos, workperthread, WIDTH, HEIGHT, param.pixmap);
	else
		MandelbrotNormalStack(param.stack, threadStartPos, workperthread, WIDTH, HEIGHT, param.pixmap);
}
fenetremandelbrot::fenetremandelbrot(QWidget *parent) :
    QWidget(parent) , pixmap(1200,1200)
{
    setFixedSize(1100,650);
    QGraphicsScene *scene = new QGraphicsScene();
    QGraphicsView *view = new QGraphicsView(scene,this);
    QPainter *p_fractale = new QPainter(&pixmap);
    //le compteur est initialisé à 0. Il va servir à l'it_max
    int a[2];
    int c[2];
    a[0]=0;
    a[1]=0;
    c[0]=1200;
    c[1]=1200; // On commence par le carré classique
    vector<vector<int> > mandelbrot = Mandelbrot(100, a, c); //ici l'iteration max est 100.
    int compteur = 0;
    while (compteur<1200*1200)
    {
        if (mandelbrot[compteur][2]==100) //100 est l'iteration max ici
        {
            p_fractale->setPen(QPen(Qt::black));
            p_fractale->drawPoint(mandelbrot[compteur][0],mandelbrot[compteur][1]);
        }
        if (1<=mandelbrot[compteur][2] && mandelbrot[compteur][2]<15)
        {
            p_fractale->setPen(QPen(Qt::darkBlue));
            p_fractale->drawPoint(mandelbrot[compteur][0],mandelbrot[compteur][1]);
        }
        if (15<=mandelbrot[compteur][2] && mandelbrot[compteur][2]<30)
        {
            p_fractale->setPen(QPen(Qt::blue));
            p_fractale->drawPoint(mandelbrot[compteur][0],mandelbrot[compteur][1]);
        }
        if (30<=mandelbrot[compteur][2] && mandelbrot[compteur][2]<45)
        {
            p_fractale->setPen(QPen(Qt::darkCyan));
            p_fractale->drawPoint(mandelbrot[compteur][0],mandelbrot[compteur][1]);
        }
        if (45<=mandelbrot[compteur][2] && mandelbrot[compteur][2]<100)
        {
            p_fractale->setPen(QPen(Qt::cyan));
            p_fractale->drawPoint(mandelbrot[compteur][0],mandelbrot[compteur][1]);
        }
        compteur++;
    }
    delete p_fractale;
    scene->addPixmap(pixmap);
    view->move(10,10);
}
Пример #3
0
void *CreateDisplay(ALLEGRO_THREAD *thr, void *arg)
{
    DISPLAY_DATA *data = (DISPLAY_DATA*) arg;   
    ALLEGRO_DISPLAY *display;

    ALLEGRO_EVENT_QUEUE *queue = al_create_event_queue();
    if(!queue) {
        fprintf(stderr, "failed to create event queue");
        return NULL;
    }

    al_lock_mutex(data->mutex);

    display = AllegroNewDisplay(data->sizeX, data->sizeY, queue);
    al_broadcast_cond(data->cond);

    // Define the size of the image
    Window<int> scr(0, data->sizeX, 0, data->sizeY);
    // Define the domain in which we test for points
    Window<double> fract(data->zoomXmin, data->zoomXmax, data->zoomYmin, data->zoomYmax);
    
    al_unlock_mutex(data->mutex);

    // Generate the fractal
    Mandelbrot(scr, fract);

    while(!al_get_thread_should_stop(thr)) {
        ALLEGRO_EVENT ev;
        al_wait_for_event(queue, &ev);

        if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
            al_set_thread_should_stop(thr);
            al_lock_mutex(data->mutex);
            al_broadcast_cond(data->cond);
            al_unlock_mutex(data->mutex);
            break;
        }       
    }

    al_destroy_display(display);
    al_destroy_event_queue(queue);
}
Пример #4
0
int main(void)
{

    tColor deepBlue = {0x80,0x17,0x0F, 0x00};
    tComplex erste = {0.0};
    tComplex zweite = {1.0};
    tComplex dritte = {0.0,(2.0/3.0)};
    tComplex vierte = {-2.0,-1.0};



    //deepblue.blue = 0x80;
    //deepblue.green = 0x17;
    //deepblue.red = 0x0F;





    VOpenGraphics("Mandelbrot", 1, SIZE_X, SIZE_Y);
    VideoRam = VGetGraphicsPointer();
    /* Ab hier folgt Ihre Lösung */

    Fillscreen(deepBlue);

    //Iteration(dritte);

    Mandelbrot(vierte);







    VWait();
    return 0;
}
int main(int argc, char** argv)
{
    Timer mainTimer(Timer::Mode::Single), mainTimerWithoutEnv(Timer::Mode::Single);
    mainTimer.Start();
    MPI_Init(&argc, &argv);
    mainTimerWithoutEnv.Start();
    int width, height;
    int commSize, commRank;
    int processNameLenght;
    int PACKAGE_AMOUNT;
    int singlePackageOffset = 1024;
    MPI_Status status;

    MPI_Comm_size(MPI_COMM_WORLD, &commSize);
    MPI_Comm_rank(MPI_COMM_WORLD, &commRank);
    MPI_Request request[commSize-1];
    MPI_Status statuses[commSize-1];
    if (commRank == 0)
    {
        if(argc != 2)
        {
            printf("%d", argc);
            printf("Wrong number of arguments, correct number is: 1- width\n");
            return 0;
        }
        width = atoi(argv[1]);
        height = width;

        singlePackageOffset = (width * height)/((commSize-1));//std::min((width * height)/(2*(commSize-1)), 1024);
        PACKAGE_AMOUNT = (width * height) / singlePackageOffset;

        int sendParameters[3];
        sendParameters[0] = width;
        sendParameters[1] = height;
        sendParameters[2] = singlePackageOffset;


        for (int i = 1; i < commSize; i++) {
            MPI_Isend(sendParameters, 3, MPI_INT, i, PARAMETERS, MPI_COMM_WORLD, &request[i-1]);
        }
        MPI_Waitall(commSize-1, request, statuses);

    }
    else
    {
        int receiveParameters[3];
        MPI_Recv(receiveParameters, 3, MPI_INT, 0, PARAMETERS, MPI_COMM_WORLD, &status);
        width = receiveParameters[0];
        height = receiveParameters[1];
        singlePackageOffset = receiveParameters[2];
    }

    if (commRank == 0)
    {
        char *results = (char*)_mm_malloc(sizeof(char) * width * height, ALLOC_TRANSFER_ALIGN);

        MPI_Request request;
        MPI_Status status;
        int totalNumberOfIterations = PACKAGE_AMOUNT;
        auto indexProvider = [&](const int index) {
            return singlePackageOffset*index;
        };
        int outValue;

        CoreStatus* currentIndexes = (CoreStatus*)_mm_malloc((commSize-1)*sizeof(CoreStatus), ALLOC_ALIGN);
        for (int j = std::min(commSize-1, totalNumberOfIterations); j > 0 ; --j) {
            currentIndexes[j-1].indexes[0] = j-1;
            currentIndexes[j-1].currentlyCalculating = 0;
            MPI_Isend(currentIndexes[j-1].indexes, 1, MPI_INT, j, DATA, MPI_COMM_WORLD, &request);

        }
        for (int j = std::min(commSize-1, totalNumberOfIterations - (commSize-1)); j > 0 ; --j) {
            currentIndexes[j-1].indexes[1] = commSize-1+j-1;
            MPI_Isend(currentIndexes[j-1].indexes + 1, 1, MPI_INT, j, DATA, MPI_COMM_WORLD, &request);

        }
        double value;

        for (int i = PACKAGE_AMOUNT-1; i >= 2*(commSize-1); --i) {
            MPI_Probe(MPI_ANY_SOURCE, DATA, MPI_COMM_WORLD, &status);
            MPI_Recv(results + indexProvider(currentIndexes[status.MPI_SOURCE-1].indexes[currentIndexes[status.MPI_SOURCE-1].currentlyCalculating]), singlePackageOffset, MPI_CHAR, status.MPI_SOURCE, DATA, MPI_COMM_WORLD, &status);

            currentIndexes[status.MPI_SOURCE-1].indexes[currentIndexes[status.MPI_SOURCE-1].currentlyCalculating] = i;

            MPI_Isend(currentIndexes[status.MPI_SOURCE-1].indexes + currentIndexes[status.MPI_SOURCE-1].currentlyCalculating, 1, MPI_INT, status.MPI_SOURCE, DATA, MPI_COMM_WORLD, &request);

            currentIndexes[status.MPI_SOURCE-1].currentlyCalculating = (currentIndexes[status.MPI_SOURCE-1].currentlyCalculating +1)%2;
        }

        for (int i = std::min(2*(commSize-1), totalNumberOfIterations); i > 0; --i) {
            MPI_Probe(MPI_ANY_SOURCE, DATA, MPI_COMM_WORLD, &status);
            MPI_Recv(results + indexProvider(currentIndexes[status.MPI_SOURCE-1].indexes[currentIndexes[status.MPI_SOURCE-1].currentlyCalculating]), singlePackageOffset, MPI_CHAR, status.MPI_SOURCE, DATA, MPI_COMM_WORLD, &status);


            currentIndexes[status.MPI_SOURCE-1].currentlyCalculating = (currentIndexes[status.MPI_SOURCE-1].currentlyCalculating +1)%2;
        }

        for (int i = commSize-1; i > 0; --i) {
            MPI_Isend(nullptr, 0, MPI_INT, i, ENDGEN, MPI_COMM_WORLD,
                      &request);
        }
        _mm_free(currentIndexes);
        _mm_free(results);
    }
    else
    {
        char* results = (char*)_mm_malloc(2*singlePackageOffset, ALLOC_TRANSFER_ALIGN);
        int currentlyCalculating = 0;
        int inValue[2];
        int value[2];
        MPI_Status status[2];
        MPI_Request request[2];
        MPI_Recv(inValue, 1, MPI_INT,0, MPI_ANY_TAG, MPI_COMM_WORLD, status);
        while (status->MPI_TAG != ENDGEN){
            MPI_Irecv(inValue+((currentlyCalculating+1)%2), 1, MPI_INT,0, MPI_ANY_TAG, MPI_COMM_WORLD, request+((currentlyCalculating+1)%2));

            Mandelbrot(results+currentlyCalculating*singlePackageOffset, singlePackageOffset*inValue[currentlyCalculating], width, height, singlePackageOffset);

            MPI_Isend(results+currentlyCalculating*singlePackageOffset, singlePackageOffset ,MPI_CHAR ,0 ,DATA ,MPI_COMM_WORLD ,request + currentlyCalculating);
            currentlyCalculating = (currentlyCalculating+1)%2;

            MPI_Wait(request + currentlyCalculating, status);
        };
    }
    if (commRank == 0) {
        mainTimerWithoutEnv.Stop();
#ifndef __MIC__
        printf("MPI,%d,%d,%lu,", commSize - 1, width, mainTimerWithoutEnv.Get());
#endif
    }
    MPI_Finalize();
    if (commRank == 0) {
        mainTimer.Stop();
#ifndef __MIC__
        printf("%lu,", mainTimer.Get());
#endif
    }

    return 0;
}
//afisare Mandelbrot
void Display8() {

	double x;
	double y;	
	Mandelbrot man(0,0,1);

	glBegin(GL_POINTS);
	for(x=-2;x<2;x+=0.01)
		for(y=-2;y<2;y+=0.01)
		{
			man=Mandelbrot(x,y,100);
			man.trym();
			if(man.ism==0)
			{
				if(man.iter<2)
					glColor3f(0,0,0);
				else if(man.iter<3)
					glColor3f(0.1,0,0);
				else if(man.iter<5)
					glColor3f(0.2,0,0);
				else if(man.iter<10)
					glColor3f(0.4,0,0);
				else if(man.iter<15)
					glColor3f(0.6,0,0);
				else if(man.iter<20)
					glColor3f(0.8,0,0);

				glVertex2d(x/2, y/2);
			}
			else
			{
				glColor3f(1,0.5,0.5);
				glVertex2d(x/2, y/2);
			}
		}
	glEnd();

	/*
  char cx[3];
  sprintf(cx, "%2d", x);
  char cy[3];
  sprintf(cy, "%2d", y);
  glRasterPos2d(-0.98,-0.98);
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, '(');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, cx[0]);
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, cx[1]);
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ',');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, cy[0]);
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, cy[1]);
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ')');
  */

  glRasterPos2d(-1.0,0.9);
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'M');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'u');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'l');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 't');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'i');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'm');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'e');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'a');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ' ');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'M');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'a');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'n');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'd');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'e');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, '1');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'b');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'r');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 'o');
  glutBitmapCharacter(GLUT_BITMAP_9_BY_15, 't');

}