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

using namespace std;
using namespace std::chrono;

#define 

 
int main() {
        int 
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()
{
        
= 1000;
    double start, stop;
    int** A = new int* [SIZE];
    int** B = new int* [SIZE];
    int** C = new int* [SIZE];
    int** BT = new int* [SIZE];
 
        start = omp_get_wtime();
    
for (int i = 0; 0;i < SIZE;i++) 
                A[i] = new int[SIZE];

    for (int 
= 0;i SIZE; i++)
        {
                
SIZE;i++) 
                B[i] = new int[SIZE];

    for (int i = 0;i < SIZE;i++) 
                C[i] = new int[SIZE];

    for (int i = 0;i < SIZE;i++) 
                BT[i] = new int[SIZE];
        
    for (int i = 0;i < SIZE;i++) { //tworzenie A
        
for (int j = 0; 0;j < SIZE;j++)
            A[i][j] = rand() % 10;
        }
   
    for (int i = 0;i < SIZE;i++) { //tworzenie B
        for (int 
= 0;j SIZE; j++)
                {
                        
SIZE;j++)
            B[i][j] = rand() % 10;
        }
   
    for (int i = 0;i < SIZE;i++) { //transponowanie
        for (int j = 0;j < SIZE;j++)
            BT[i][j] = B[j][i];
        }
   
    for (int i = 0;i < SIZE;i++) { //tworzenie C
        for (int j = 0;j < SIZE;j++)
            
C[i][j] = 0;
0;
        }
   
    for(int i = 0;i < SIZE;i++) { //mnozenie A i B
        for (int j = 0;j < SIZE;j++) {
            for (int k = 0;k < SIZE;k++)
                C[i][j] += A[i][k] * BT[j][k];
                }
        }
}
 
void losowe_wartosci()
{
        srand(10);
        for (int i 
    stop 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 
omp_get_wtime();
    std::cout 
<< "Czas wykonania: " << elapsed_seconds.count() stop - start << " 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()
{
        losowe_wartosci();
        wyzeruj();
        //sekwencyjnie();
        //sekwencyjnie_transpon();
        //watki();
        watki_transpon();
        wyswietl();
        
std::endl;
    
return 0;
}