perflab finished

This commit is contained in:
2025-04-17 23:02:23 +08:00
parent ba21f80f3b
commit cc99d9b5d9
39 changed files with 1477 additions and 2007 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 655 KiB

View File

@ -1,7 +1,8 @@
# Makefile for word frequency analysis program
CC = icx
CFLAGS = -Ofast -pg
#CFLAGS = -O2 -pg
CFLAGS = -Ofast -Wall
TARGET = prog
SOURCES = prog.c options.c

Binary file not shown.

Binary file not shown.

View File

@ -3,7 +3,6 @@
#include "options.h"
#include "string.h"
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
@ -26,13 +25,28 @@ typedef void (*lower_fun_t)(char *s);
/* Lower case conversion routines */
/* Convert string to lower case: slow */
void lower1(char *s) {
int i;
/* Convert string to lower case: optimized with lookup table */
static unsigned char lcase_table[256];
static int table_initialized = 0;
for (i = 0; i < Strlen(s); i++)
if (s[i] >= 'A' && s[i] <= 'Z')
s[i] -= ('A' - 'a');
void init_lcase_table() {
if (!table_initialized) {
int i;
for (i = 0; i < 256; i++)
lcase_table[i] = i;
for (i = 'A'; i <= 'Z'; i++)
lcase_table[i] = i - ('A' - 'a');
table_initialized = 1;
}
}
void lower1(char *s) {
init_lcase_table();
unsigned char *us = (unsigned char *)s;
while (*us) {
*us = lcase_table[*us];
us++;
}
}
/* Convert string to lower case: faster */
@ -137,9 +151,20 @@ unsigned h_xor(char *s) {
return val % tsize;
}
#define HCNT 3
hash_fun_t hash_fun_set[HCNT] = {h_mod, h_add, h_xor};
char *hash_fun_names[HCNT] = {"h_mod", "h_add", "h_xor"};
/* FNV-1a hash function */
unsigned h_fnv1a(char *s) {
unsigned hash = 2166136261u;
unsigned char *us = (unsigned char *)s;
while (*us) {
hash ^= *us++;
hash *= 16777619u;
}
return hash % tsize;
}
#define HCNT 4
hash_fun_t hash_fun_set[HCNT] = {h_mod, h_add, h_xor, h_fnv1a};
char *hash_fun_names[HCNT] = {"h_mod", "h_add", "h_xor", "h_fnv1a"};
char *save_string(char *s) {
char *result = (char *)malloc(Strlen(s) + 1);
@ -194,7 +219,6 @@ h_ptr find_ele_iter_f(h_ptr ls, char *s) {
h_ptr find_ele_iter_r(h_ptr ls, char *s) {
h_ptr ele = ls;
h_ptr last = NULL;
#pragma omp parallel shared(ls, s, last)
for (ele = ls; ele; ele = ele->next) {
char *word = ele->word;
if (strcmp(s, word) == 0) {
@ -220,10 +244,10 @@ h_ptr find_ele_iter_r(h_ptr ls, char *s) {
typedef h_ptr (*find_ele_fun_t)(h_ptr, char *);
#define FCNT 3
find_ele_fun_t find_ele_fun_set[FCNT] = {find_ele_iter_r, find_ele_iter_f,
find_ele_rec};
char *find_ele_fun_names[FCNT] = {"find_ele_iter_r", "find_ele_iter_f",
"find_ele_rec"};
find_ele_fun_t find_ele_fun_set[FCNT] = {find_ele_rec, find_ele_iter_f,
find_ele_iter_r};
char *find_ele_fun_names[FCNT] = {"find_ele_rec", "find_ele_iter_f",
"find_ele_iter_r"};
/* Comparision function for sorting */
int compare_ele(const void *vele1, const void *vele2) {
@ -386,8 +410,8 @@ void word_freq(FILE *src, int verbose, int ngram, int size, int quick,
int main(int argc, char *argv[]) {
int verbose = 1;
int size = 1024;
int hash_fun_index = 0;
int size = 32768; // 修改默认值为32768
int hash_fun_index = 3;
int lower_fun_index = 0;
int find_fun_index = 0;
int ngram = 1;