Skip to content

Programa em C, desenvolvido durante a disciplina de Sistemas Operacionais, da FT-Unicamp.

Notifications You must be signed in to change notification settings

mpbruder/SO-KGBcomM

Repository files navigation

KGBcomM

UNICAMP - Universidade Estadual de Campinas.
FT - Faculdade de Tecnologia.
Limeira - SP.

Maio 2019 - 1S2019

Introdução

O projeto tem como objetivo a criação de um programa, a partir da linguagem C, que utilize múltiplas threads para dividir uma matriz NxN, em que N representa as dimensões da matriz, respectivamente, linhas e colunas, em outras duas matrizes também NxN de tal forma que a primeira seja composta por elementos a partir da diagonal principal e acima; e a segunda matriz com elementos abaixo da diagonal principal.

O programa foi escrito para o sistema operacional Linux e utilizou a biblioteca POSIX threads.

Descrição do problema a ser resolvido

Considere uma matriz N x N (N linhas por N colunas) que contém valores em ponto flutuante, positivos ou negativos. O programa deverá utilizar múltiplos threads para dividir essa matriz em outras duas conforme ilustrado na figura a seguir.

enter image description here

A matriz original deve ser dividida em outras duas matrizes também N x N de tal forma que a primeira matriz seja composta por elementos a partir da diagonal principal e acima; e a segunda matriz com elementos abaixo da diagonal principal.

Os dados da matriz original devem vir de um arquivo e as matrizes resultantes devem ser gravadas em arquivos com as extensões diag1 para os dados da primeira matriz e diag2 para os dados da segunda matriz.

O programa deve ser testado para 2, 4, 8 e 16 threads, com matrizes 1000 x 1000.

Material e Método

Instrução para a compilação do código

Para compilar o código, foi utilizado o sistema Linux e o comando:

gcc -pthread divideMat.c -o divideMat

Explicação do código em alto nível

Ao executar o programa, é passado por linha de comando, a dimensão da matriz o número de threads com qual o programa será executado e o arquivo de entrada, em que está a matriz que será processada. O número de threads pode ser 2, 4, 8 ou 16 e a matriz em questão é quadrática.

Se a quantidade de threads for respeitada, há a alocação das três matrizes, isto é, a matriz principal, a matriz diagonal 1 e a matriz diagonal 2. Caso contrário, é informado ao usuário que o número de threads é inválido. Após as alocações das matrizes, abre-se o arquivo de entrada que possui os dados da matriz principal, ou seja, a matriz que será processada. Se não houver erro na abertura, inicia-se leitura dos dados do arquivo e, ao terminar, o arquivo é fechado. Vale ressaltar, que logo após o término da leitura começa a marcação do tempo inicial, como se fosse o início do cronômetro. A partir disso, o próximo passo é a criação das threads, com o comando:

pthread_create(&vThread[i], NULL, threadDividirMatriz, (void *)&info[i]);

Esse comando está dentro de um FOR, o qual tem como limite o número de threads. O comando é responsável pela criação de uma thread, bem como, pela chamada da função que tem como responsabilidade realizar a divisão da matriz principal em matriz diagonal 1 e matriz diagonal 2. Também há um FOR responsável para que todas as threads retornem ao mesmo tempo, por meio do comando:

pthread_join(vThread[i], NULL);

Após todas as threads terminarem seus respectivos processamentos, há a marcação do tempo final. Então ao realizar a subtração do tempo final pelo tempo inicial tem-se o tempo total de execução.

Por fim, abre-se o arquivo de destino e se não houver erro de abertura,grava-se a matriz diagonal 2 no arquivo e o fecha. O mesmo procedimento ocorre para matriz 1 diagonal 1.

Conclusão

No início do projeto, era esperado que o tempo médio de execução fosse inversamente proporcional ao número de threads, ou seja, quanto maior fosse o número de threads, menor seria o tempo de execução. Esse resultado era esperado, pois, ao alocar dezesseis threads trabalhando simultaneamente, espera-se que desempenho seja maior do que duas threads trabalhando simultaneamente na mesma tarefa.

Entretanto, os resultados alcançados mostraram que para o programa desenvolvido, o ideal é trabalhar com quatro threads, isso porque é um programa de baixa complexidade. Logo, a criação de cada uma das threads demanda muito tempo e isso faz com que o desempenho fique menor.

Contudo, para programas com uma alta complexidade, possivelmente o tempo médio de execução será inversamente proporcional ao número de threads.

Informações extras

About

Programa em C, desenvolvido durante a disciplina de Sistemas Operacionais, da FT-Unicamp.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages