Facebook
From Whipped Partdridge, 3 Years ago, written in Plain Text.
This paste is a reply to Untitled from Putrid Cat - go back
Embed
Viewing differences between Untitled and Re: Untitled
#include 
#include 




#include 
#include 
#include 

using namespace std;
using namespace std::chrono;

#define SIZE 2000 //1000 i 2000
#define LICZBA_WATKOW 4 //1, 2 i 4

int A[SIZE][SIZE];
int B[SIZE][SIZE];
int Bt[SIZE][SIZE];
int C[SIZE][SIZE];

void wyzeruj()
{
        for (int i = 0; i < SIZE; i++)
        {
                for (int j = 0; j < SIZE; j++)
                {
                        C[i][j] = 0;
                }
        }
}
 
void losowe_wartosci()
{
        srand(10);
        for (int i = 0; i < SIZE; i++)
        {
                for (int j = 0; j < SIZE; j++)
                {
                        A[i][j] = rand() % 10;
                        B[i][j] = rand() % 10;
                }
        }
}

void transponowanie()
{
        for (int i = 0; i < SIZE; i++)
        {
                for (int j = 0; j < SIZE; j++)
                {
                        Bt[i][j] = B[j][i];
                }
        }
}

void pomnoz_macierze(int start, int stop)
{
        for (int i = start; i < stop; i++)
        {
                for (int j = 0; j < SIZE; j++)
                {
                        for (int k = 0; k < SIZE; k++)
                        {
                                C[i][j] += A[i][k] * B[k][j];
                        }
                }
        }
}

void pomnoz_macierze_transpon(int start, int stop)
{
        for (int i = start; i < stop; i++)
        {
                for (int j = 0; j < SIZE; j++)
                {
                        for (int k = 0; k < SIZE; k++)
                        {
                                C[i][j] += A[i][k] * Bt[j][k]; //[j][k] bo transponowane
                        }
                }
        }
}

void sekwencyjnie()
{
        duration elapsed_seconds;
    time_point begin = system_clock::now();
        pomnoz_macierze(0,SIZE);
    elapsed_seconds = system_clock::now() - begin;
    cout << "Czas wykonania: " << elapsed_seconds.count() << " s" << endl;
}

void sekwencyjnie_transpon()
{
        transponowanie();
        duration elapsed_seconds;
    time_point begin = system_clock::now();
        pomnoz_macierze_transpon(0,SIZE);
    elapsed_seconds = system_clock::now() - begin;
    cout << "Czas wykonania: " << elapsed_seconds.count() << " s" << endl;
}

void watki()
{
        duration elapsed_seconds;
        std::vector v;
        int rozmiar_paczki = SIZE / LICZBA_WATKOW;
    time_point begin = system_clock::now();
        for (int i = 0; i < LICZBA_WATKOW; i++)
        {
                if (i == LICZBA_WATKOW - 1) //ostatni watek 
                {
                        v.push_back(new std::thread{ pomnoz_macierze, i * rozmiar_paczki, SIZE });
                }
                else
                {
                        v.push_back(new std::thread{ pomnoz_macierze, i * rozmiar_paczki, i * rozmiar_paczki + rozmiar_paczki });
                }
        }
        for (int i = 0; i < LICZBA_WATKOW; i++)
        {
                v[i]->join();
                delete v[i];
        }
    elapsed_seconds = system_clock::now() - begin;
    cout << "Czas wykonania: " << elapsed_seconds.count() << " s" << endl;
}

void watki_transpon()
{
        transponowanie();
        duration elapsed_seconds;
        std::vector v;
        int rozmiar_paczki = SIZE / LICZBA_WATKOW;
    time_point begin = system_clock::now();
        for (int i = 0; i < LICZBA_WATKOW; i++)
        {
                if (i == LICZBA_WATKOW - 1) //ostatni watek
                {
                        v.push_back(new std::thread{ pomnoz_macierze_transpon, i * rozmiar_paczki, SIZE });
                }
                else
                {
                        v.push_back(new std::thread{ pomnoz_macierze_transpon, i * rozmiar_paczki, i * rozmiar_paczki + rozmiar_paczki });
                }
        }
        for (int i = 0; i < LICZBA_WATKOW; i++)
        {
                v[i]->join();
                delete v[i];
        }
    elapsed_seconds = system_clock::now() - begin;
            cout << "Czas wykonania: " << elapsed_seconds.count() << " s" << endl;
}

void wyswietl()
{
        std::cout << "Macierz C:" << std::endl;
        for (int i = 0; i < 5; i++)
        {
                for (int j = 0; j < 5; j++)
                {
                        std::cout << C[i][j] << "\t";
                }
                std::cout << std::endl;
        }
}

int main()
{

    int a1 = 2000;
    int a2 = 2000;
    int b1 = 2000;
    int b2 = 2000;

    double start, stop;
    start = omp_get_wtime();
    
    int **A = new int *[a1];
    int **B = new int *[a2];
    int **C = new int *[a1];
    int **BT = new int *[a2];

    for (int i = 0;i < a1;i++) A[i] = new int[b1];
    for (int i = 0;i < a2;i++) B[i] = new int[b2];
    for (int i = 0;i < a1;i++) C[i] = new int[b2];
    for (int i = 0;i < a2;i++) BT[i] = new int[b1];
    
    for (int i = 0;i < a1;i++)
        for (int j = 0;j < b1;j++)
            A[i][j] = 1;
    
    for (int i = 0;i < a2;i++)
        for (int j = 0;j < b2;j++)
            B[i][j] = 1;
    
    for (int i = 0;i < a2;i++)
        for (int j = 0;j < b1;j++)
            BT[i][j] = B[j][i];
    
    for (int i = 0;i < a1;i++)
        for (int j = 0;j < b2;j++)
            C[i][j] = 0;
    
    //#pragma omp parallel for num_threads(1)
    for(int k = 0;k < a1;k++)
        for (int i = 0;i < a2;i++)
            for (int j = 0;j < b1;j++)
                C[k][i] += A[k][j] * BT[i][j];

    stop = omp_get_wtime();
 
    
    std::cout << "A:" << a1 << "x" << b1 << " B:" << a2 << "x" << b2 <     std::cout << "Time: "<< stop - start;
             
    
    
{
        losowe_wartosci();
        wyzeruj();
        //sekwencyjnie();
        //sekwencyjnie_transpon();
        //watki();
        watki_transpon();
        wyswietl();
        
return 0;
}

Replies to Re: Untitled rss

Title Name Language When
Re: Re: Untitled Little Bison text 3 Years ago.