Ir ao conteúdo
  • Cadastre-se

cristiano moreira

Membro Júnior
  • Posts

    5
  • Cadastrado em

  • Última visita

Tudo que cristiano moreira postou

  1. #include<stdio.h> #include<stdlib.h> //#include <pthread.h> #include <sys/time.h> #include<omp.h> #define TAMANHO_VETOR 10000 void quickSort(int *vetor, int inicio, int fim); void populaVetorDecrescente(int *endVetor, int tamanhoVetor); int estaOrdenado(int *vetor, int tamanhoVetor); int numChamadasRecursivas = 0; int main(void){ struct timeval start, end; double diff; srand(time(NULL)); //seed random int *vetor = (int *) malloc(TAMANHO_VETOR*sizeof(int)); populaVetorDecrescente(vetor, TAMANHO_VETOR); #pragma omp parallel for for(int i = 0; i < TAMANHO_VETOR; i++){ printf("%d ", vetor[i]); } puts(""); gettimeofday(&start, NULL); quickSort(vetor, 0, TAMANHO_VETOR - 1); gettimeofday(&end, NULL); if(!estaOrdenado(vetor, TAMANHO_VETOR)){ printf("Oops, vetor não foi ordenado pelo quickSort.\n"); } //Calcula tempo... diff = ((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec))/1000000.0; printf("Quicksort sequencial demorou %lfs para ordenar %d" " elementos...\n", diff, TAMANHO_VETOR); /* for(int i = 0; i < TAMANHO_VETOR; i++){ printf("%d ", vetor[i]); } puts(""); */ printf("Numero de chamadas recursivas: %d\n", numChamadasRecursivas); free(vetor); } void quickSort(int *vetor, int inicio, int fim){ numChamadasRecursivas++; int i, j, meio, aux; i = inicio; j = fim; meio = vetor[(inicio + fim) / 2]; //Repetir os passos abaixo enquanto i e j não se encontrarem, ou seja, //incremente i e decrementa j, sempre os testando contra o valor apontado //pelo pivô (meio) (avaça i se for < meio, e recua j se for > meio). Feito //isso, teremos dois sub-vetores (os < q meio e os > que meio) do{ //1. Avança i enquanto valor apontado por ele for < meio. while(vetor[i] < meio){ i++; } //2. Recua j enquanto valor apontado por ele for > meio. while(vetor[j] > meio){ j--; } //3. Trocar os valor apontados por i e j. if(i <= j){ aux = vetor[i]; vetor[i] = vetor[j]; vetor[j] = aux; i++; j--; } //Repete enquanto i e j não se encontrarem... }while(i <= j); //A partir daqui sub-divide-se a lista, pois todos os > que o meio estão //à direita e os menores à esquerda. //Repete, recursivamente, para os sub-vetores criados enquanto existirem + //de um elemento em cada lado. if(inicio < j){ quickSort(vetor, inicio, j); } if(i < fim){ quickSort(vetor, i, fim); } } //Função para popular um vetor de forma decrescente. Pior caso... void populaVetorDecrescente(int *endVetor, int tamanhoVetor){ int valor = tamanhoVetor, i; for(i = 0; i < tamanhoVetor; i++){ endVetor[i] = valor--; } } //Verifica se vetor está ordenado (crescente...). int estaOrdenado(int *vetor, int tamanhoVetor){ for (int i = 1; i < tamanhoVetor; i ++){ if (vetor[i] < vetor[i-1]){ printf("posicao %d, %d < %d \n", i, vetor[i], vetor[i-1]); return 0; } } return 1; } *Como implemento openmp neste programa não sei como implementar e deixar mais eficiente este programa alguém pode me ajudar.
  2. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace MemCache { class Prog_MemCache { int counter = 0; String line; System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\crist\Desktop\programasC#"); // Função para configurar a instrução do arquivo trace public static string ConfigInst(string val_hex) { // retirando os dois primeiros caracteres da instrução para ficar só o HEX válido string new_inst = val_hex.Substring(2, val_hex.Length - 2); if (new_inst.Length < 8) { // completando com zeros a esquerda o HEX, se necessário, até ter 8 caracteres while (new_inst.Length < 8) new_inst = new_inst.Insert(0, "0"); } //Console.WriteLine("{0}", new_inst); return new_inst; } // Função que converte um valor binário em decimal public static string BinToDec(string val_bin) { int val_dec = 0; // valor em DEC int aux = 0; int i = -1; char[] arrChar = val_bin.ToCharArray(); // dígitos do valor BIN Array.Reverse(arrChar); // invertendo a ordem do BIN string val_bin_inv = new String(arrChar); //Console.WriteLine(val_bin_inv); // lendo o BIN de trás para frente para poder converter em DEC foreach (char val in val_bin_inv) { i++; if (val.ToString() == "1") { if (i == 0) val_dec = val_dec + 1; else { aux = 1; for (int j = 1; j <= i; j++) { aux = (aux * 2); } } val_dec = val_dec + aux; } } return val_dec.ToString(); } // Função que converte um valor hexadecimal em binário public static string HexToBin(string val_hex) { string val_dec; // valor em DEC string val_bin = ""; // de 0 a 15 em BIN de quatro dígitos string[] bin_lista = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" }; int count = 0; foreach (char val in val_hex) { count++; // convertendo cada letra/dígito do HEX if (val.ToString().ToUpper() == "A") val_dec = "10"; else if (val.ToString().ToUpper() == "B") val_dec = "11"; else if (val.ToString().ToUpper() == "C") val_dec = "12"; else if (val.ToString().ToUpper() == "D") val_dec = "13"; else if (val.ToString().ToUpper() == "E") val_dec = "14"; else if (val.ToString().ToUpper() == "F") val_dec = "15"; else val_dec = val.ToString(); //Console.WriteLine("{0}: {1}", count, bin_lista[Convert.ToUInt16(val_dec)]); //Console.ReadKey(); val_bin = val_bin + bin_lista[Convert.ToUInt16(val_dec)]; if (count < val_hex.Length) val_bin = val_bin + " "; } return val_bin; } // Função que testa se houve HIT (True) ou MISS (False) public static int TestHit(string[,,] cache, string inst, int r, int w, int qd_layers) { // converte a instrução HEX em BIN string inst_bin = HexToBin(inst).Replace(" ", ""); // captura o índice BIN da palavra string word = inst_bin.Substring(inst_bin.Length - w, w); // captura o índice BIN da linha string row = inst_bin.Substring(inst_bin.Length - (r+w), r); // captura a tag BIN string tag = inst_bin.Substring(0, 32 - w - r); // convertendo os índices de BIN para DEC int row_index = Convert.ToUInt16(BinToDec(row)); int word_index = Convert.ToUInt16(BinToDec(word)); int aux = -1; // comparando o conteúdo da tag com a que está na cache e retornando o índice da camada em que houve o hit for (int i = 0; i <= qd_layers - 1; i++) { if (cache[i, row_index, word_index].Equals(tag)) { aux = i; break; } } Console.Write("Teste = {0}: Cache[{1},{2}] = {3}", aux, row_index, word_index, tag); return aux; // se der hit retorna o índice da camada, se miss retorna -1 } // Função para gerenciar a cache public static int GetLayer(string [] aux) { int layer_index = 0; string valor_anterior = aux[0]; for (int i = 0; i < aux.Length; i++) { if (aux[i].CompareTo(valor_anterior) < 0) layer_index = i; } return layer_index; } static void Main(string[] args) { // Declaração de variáveis int hits = 0; // total de hits int miss = 0; // total de miss int total = 0; // total de instruções lidas int layer_index = 0; // recebe o índice da camada long counter = 0; // contador auxiliar para escolher a camada string inst_hex; // instrução em HEX string index_word_bin; // índice da palavra em BIN string index_row_bin; // índice da linha em BIN string tag; // tag em BIN string trace_file; // nome do arquivo string line_file; // linha do arquivo //Solicitando os parâmetros da cache Console.Write("Digite quantas linhas sua cache terá, ela precisa ser potência de 2 e ter no máximo 1024 linhas: "); double rows_cache = double.Parse(Console.ReadLine()); // nova variável para receber o nº de linhas int index_row_size = Convert.ToUInt16(Math.Log(rows_cache, 2)); // nova variável para receber o tamanho do índice da linha Console.Write("Digite quantas palavras sua cache terá, ela precisa ser potência de 2 e ter no máximo 16 palavras: "); double words_cache = double.Parse(Console.ReadLine()); // nova variável para receber o nº de palavras int index_word_size = Convert.ToUInt16(Math.Log(words_cache, 2)); // nova variável para receber o tamanho do índice da palavra Console.Write("Digite quantas camadas sua cache terá, ela precisa ser potência de 2 e ter no máximo 16 camadas: "); int layers_cache = int.Parse(Console.ReadLine()); // nova variável para receber o nº de camadas string [] aux_cache = new string[layers_cache]; // novo array para controlar as camadas da cache string[,,] mem_cache = new string[layers_cache, Convert.ToUInt16(rows_cache), Convert.ToUInt16(words_cache)]; //Console.WriteLine("Sua cache terá {0} linhas com {1} palavras e os índices serão de {2} e {3} dígito(s), respectivamente.", rows_cache.ToString(), words_cache.ToString(), index_row_size.ToString(), index_word_size.ToString()); //Populando a cache com sinal de inativo: "X" for (int i = 0; i <= layers_cache - 1; i++) { aux_cache[i] = new DateTime().ToString(); for (int j = 0; j <= Convert.ToUInt16(rows_cache) - 1; j++) { for (int k = 0; k <= Convert.ToUInt16(words_cache) - 1; k++) { mem_cache[i, j, k] = "X"; Console.WriteLine("Cache[{0}, {1}, {2}]= {3}", i, j, k, mem_cache[i, j, k]); } } } // Solicitando o nome do arquivo de trace que está na pasta traces do projeto Console.Write("Digite o nome do arquivo de trace com sua extensão: "); trace_file = "../../traces/"+ Console.ReadLine(); // Read the file and display it line by line. StreamReader file = new StreamReader(path: @trace_file); while ((line_file = file.ReadLine()) != null) { total++; // só contabiliza o hit/miss se a primeira instrução for "2" if (line_file[0].ToString().Equals("2")) { inst_hex = ConfigInst(line_file); total++; // testando se foi HIT ou MISS layer_index = TestHit(mem_cache, inst_hex, index_row_size, index_word_size, layers_cache); if (layer_index > -1) { hits++; index_word_bin = HexToBin(inst_hex).Replace(" ", "").Substring(32 - index_word_size, index_word_size); index_row_bin = HexToBin(inst_hex).Replace(" ", "").Substring(32 - (index_row_size + index_word_size), index_row_size); tag = HexToBin(inst_hex).Replace(" ", "").Substring(0, 32 - (index_word_size + index_row_size)); // Alterando o conteúdo da linha mem_cache[layer_index, Convert.ToUInt16(BinToDec(index_row_bin)), Convert.ToUInt16(BinToDec(index_word_bin))] = tag; // Atualizando o conteúdo do array gerenciador de cache aux_cache[layer_index] = (counter++).ToString(); //Console.WriteLine(" == {0} HIT! Camada {1}", mem_cache[layer_index, Convert.ToUInt16(BinToDec(index_row_bin)), Convert.ToUInt16(BinToDec(index_word_bin))], layer_index); } else { miss++; index_word_bin = HexToBin(inst_hex).Replace(" ", "").Substring(32 - index_word_size, index_word_size); index_row_bin = HexToBin(inst_hex).Replace(" ", "").Substring(32 - (index_row_size + index_word_size), index_row_size); tag = HexToBin(inst_hex).Replace(" ", "").Substring(0, 32 - (index_word_size + index_row_size)); layer_index = GetLayer(aux_cache); // Alterando o conteúdo da linha mem_cache[layer_index, Convert.ToUInt16(BinToDec(index_row_bin)), Convert.ToUInt16(BinToDec(index_word_bin))] = tag; // Atualizando o conteúdo do array gerenciador de cache aux_cache[layer_index] = (counter++).ToString(); Console.WriteLine(" != {0} MISS! Camada {1}", mem_cache[layer_index, Convert.ToUInt16(BinToDec(index_row_bin)), Convert.ToUInt16(BinToDec(index_word_bin))], layer_index); } Console.ReadKey(); } } file.Close(); for (int n = 0; n < aux_cache.Length; n++) { Console.WriteLine("Aux[{0}] = {1}", n, aux_cache[n]); } Console.Write("Houveram {0} hits, {1} miss de um total de {2} instruções. Taxa de Hits: {0}/{2} ({3:0.00}%)", hits, miss, total, (100*(Convert.ToDouble(hits))/Convert.ToDouble(total))); // Suspend the screen. Console.ReadKey(); } } } Preciso de uma ajuda no meu simulador de memória cache, este simulador terá que ler um arquivo gerado em txt ler linha por linha e alocar em blocos de memória, e dizer se quantos hits e miss terá além de gera o resultado em um txt, se alguém puder me ajudar o código e este.
  3. Boa tarde amigo minha duvida é como pego um bloco que esta em um txt para ser lido e depois salvo o resultado em outro txt.
  4. Gostaria de uma ajuda estou meio perdido se alguém puder me dar uma ajuda agradeço não sei como inicio esse programa. memoria cache.txt

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...