Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] [openmp] [task] [linux] [sfml] brak przyspieszenia

Ostatnio zmodyfikowano 2019-01-13 23:59
Autor Wiadomość
aaadam
Temat założony przez niniejszego użytkownika
[c++] [openmp] [task] [linux] [sfml] brak przyspieszenia
» 2019-01-06 13:41:24
witam, staram się zrównoleglić trójkąt sierpińskiego za pomocą openmp przy użyciu pragmy task, niestety gdy dodałem te pragmy to czas wykonywania programu nie zmienił się.
Tak kompiluję :

 
g++ -c sierpinski.cpp -I/usr/include -o sierpinski.o
g++ sierpinski.o  -lsfml-graphics -lsfml-window -lsfml-system -lgomp -openmp -o sierpinski


aplikacja printuje ciągle :
Thread rank: 0
Setting vertical sync not supported
28.7822

czas mniej więcej taki sam

ktoś coś może doradzić ??

kod poniżej

C/C++
#include <SFML/Graphics.hpp>

#include <omp.h>
#include <time.h>
#include <iostream>




void drawSierpinski( float x1, float y1, float x2, float y2, float x3, float y3, sf::RenderWindow * window );
void subTriangle( int n, float x1, float y1, float x2, float y2, float x3, float y3, sf::RenderWindow * window );

//ilosc wywolan rekrencyjnych
int depth = 15;

int main( int argc, char * argv[] )
{
    printf( "Thread rank: %d\n", omp_get_thread_num() );
    int SIZE = 700;
    int h = SIZE;
    int w = SIZE;
    sf::RenderWindow window( sf::VideoMode( SIZE, SIZE ), "SFML works!" );
    sf::CircleShape shape( 100.f );
    shape.setFillColor( sf::Color::Green );
    clock_t start, finish;
    start = clock();
    drawSierpinski( 10, h - 10, w - 10, h - 10, w / 2, 10, & window );
   
    finish = clock();
    double processing_time =( double( finish - start ) / CLOCKS_PER_SEC );
    std::cout << processing_time << std::endl;
   
    window.display();
    while( window.isOpen() )
    {
        sf::Event event;
        while( window.pollEvent( event ) )
        {
            if( event.type == sf::Event::Closed )
                 window.close();
           
        }
       
       
        // window.display();
    }
    return( 0 );
}


void drawSierpinski( float x1, float y1, float x2, float y2, float x3, float y3, sf::RenderWindow * window )
{
    //Draw the 3 sides of the triangle as black lines
    sf::Vertex line[] =
    {
        sf::Vertex( sf::Vector2f( int( x1 ), int( y1 ) ) ),
        sf::Vertex( sf::Vector2f( int( x2 ), int( y2 ) ) )
    };
   
    window->draw( line, 2, sf::Lines );
    sf::Vertex line2[] =
    {
        sf::Vertex( sf::Vector2f( int( x1 ), int( y1 ) ) ),
        sf::Vertex( sf::Vector2f( int( x3 ), int( y3 ) ) )
    };
    window->draw( line2, 2, sf::Lines );
   
   
    sf::Vertex line3[] =
    {
        sf::Vertex( sf::Vector2f( int( x2 ), int( y2 ) ) ),
        sf::Vertex( sf::Vector2f( int( x3 ), int( y3 ) ) )
    };
    window->draw( line3, 2, sf::Lines );
   
   
    //drawLine(int(x1), int(y1), int(x2), int(y2), RGB_Black);
    //drawLine(int(x1), int(y1), int(x3), int(y3), RGB_Black);
    //drawLine(int(x2), int(y2), int(x3), int(y3), RGB_Black);
   
    //funkcja rekursywna
    subTriangle
    (
    1, //cunter
    ( x1 + x2 ) / 2,
    ( y1 + y2 ) / 2,
    ( x1 + x3 ) / 2,
    ( y1 + y3 ) / 2,
    ( x2 + x3 ) / 2,
    ( y2 + y3 ) / 2,
    window
    );
}


void subTriangle( int n, float x1, float y1, float x2, float y2, float x3, float y3, sf::RenderWindow * window )
{
   
    sf::Vertex line[] =
    {
        sf::Vertex( sf::Vector2f( int( x1 ), int( y1 ) ) ),
        sf::Vertex( sf::Vector2f( int( x2 ), int( y2 ) ) )
    };
   
    window->draw( line, 2, sf::Lines );
   
    sf::Vertex line2[] =
    {
        sf::Vertex( sf::Vector2f( int( x1 ), int( y1 ) ) ),
        sf::Vertex( sf::Vector2f( int( x3 ), int( y3 ) ) )
    };
   
    window->draw( line2, 2, sf::Lines );
   
    sf::Vertex line3[] =
    {
        sf::Vertex( sf::Vector2f( int( x2 ), int( y2 ) ) ),
        sf::Vertex( sf::Vector2f( int( x3 ), int( y3 ) ) )
    };
   
    window->draw( line3, 2, sf::Lines );
    //drawLine(int(x1), int(y1), int(x2), int(y2), RGB_Black);
    //drawLine(int(x1), int(y1), int(x3), int(y3), RGB_Black);
    //drawLine(int(x2), int(y2), int(x3), int(y3), RGB_Black);
   
   
    #pragma omp parallel
    {
        #pragma omp sigle  // nie do końca jestem pewien czy ta pragma powinna tu być
        {
            if( n < depth )
            {
                #pragma omp task shared(depth)
                {
                    //1
                    subTriangle
                    (
                    n + 1,
                    ( x1 + x2 ) / 2 +( x2 - x3 ) / 2,
                    ( y1 + y2 ) / 2 +( y2 - y3 ) / 2,
                    ( x1 + x2 ) / 2 +( x1 - x3 ) / 2,
                    ( y1 + y2 ) / 2 +( y1 - y3 ) / 2,
                    ( x1 + x2 ) / 2,
                    ( y1 + y2 ) / 2,
                    window
                    );
                    //2
                }
                #pragma omp task shared(depth)
                {
                    subTriangle
                    (
                    n + 1,
                    ( x3 + x2 ) / 2 +( x2 - x1 ) / 2,
                    ( y3 + y2 ) / 2 +( y2 - y1 ) / 2,
                    ( x3 + x2 ) / 2 +( x3 - x1 ) / 2,
                    ( y3 + y2 ) / 2 +( y3 - y1 ) / 2,
                    ( x3 + x2 ) / 2,
                    ( y3 + y2 ) / 2,
                    window
                    );
                }
                #pragma omp task shared(depth)
                {
                    //3
                    subTriangle
                    (
                    n + 1, //Number of recursions for the next call increased with 1
                    ( x1 + x3 ) / 2 +( x3 - x2 ) / 2, //x coordinate of first corner
                    ( y1 + y3 ) / 2 +( y3 - y2 ) / 2, //y coordinate of first corner
                    ( x1 + x3 ) / 2 +( x1 - x2 ) / 2, //x coordinate of second corner
                    ( y1 + y3 ) / 2 +( y1 - y2 ) / 2, //y coordinate of second corner
                    ( x1 + x3 ) / 2, //x coordinate of third corner
                    ( y1 + y3 ) / 2, //y coordinate of third corner
                    window
                    );
                }
            } }
    }
}
P-173433
pekfos
» 2019-01-06 16:12:21
-openmp jest w ICC. W GCC jest -fopenmp.
P-173436
aaadam
Temat założony przez niniejszego użytkownika
» 2019-01-06 19:26:08
zmieniłem kompilowanie na :

g++ -c sierpiński.cpp -I/usr/include

g++ sierpiński.o -lsfml-graphics -lsfml-window -lsfml-system -lgomp -fopenmp -o sierpiński

nie pomaga

używam virtualboxa do tego, w ustawieniach przydzieliłem 4 procesory

zrównolegliłem też mandelbrota za pomocą pragmy for i działa :


debian@debian:~/rownolegle$ g++ mandelbrot.cpp -lgomp -fopenmp -o test
debian@debian:~/rownolegle$ ./test 8
start 10000  threats :8
Czas obliczen = 6.42481
debian@debian:~/rownolegle$ g++ mandelbrot.cpp -lgomp -fopenmp -o test
debian@debian:~/rownolegle$ ./test 2
start 10000  threats :2
Czas obliczen = 11.303
P-173440
pekfos
» 2019-01-06 19:33:20
Brakuje omp_set_nested().

threats :8
Najlepsze są takie literówki, które z jednego istniejącego słowa trafiają na inne istniejące słowo :P
P-173441
aaadam
Temat założony przez niniejszego użytkownika
» 2019-01-13 23:20:10
każdemu się może zdarzyć :)

dodałem omp_set_nested(1); na początku maina i nie pomaga :(
P-173541
pekfos
» 2019-01-13 23:59:02
Spróbuj tak:
C/C++
void funkcja()
{
    #pragma omp task
    funkcja();
   
    #pragma omp task
    funkcja();
   
    // Bez task
    funkcja();
}

// Jedno parallel przed pierwszym wywołaniem
#pragma omp parallel
{
    #pragma omp single
    funkcja();
}
P-173543
« 1 »
  Strona 1 z 1