并行的OpenMP不会加速c中的程序

时间:2017-03-22 08:42:55

标签: c parallel-processing openmp

您好我正在尝试创建自己的grep程序版本。该程序将模式和文本文件作为输入并逐行搜索文件。当在行中找到模式时,将打印该行。

我的问题是我想并行搜索,同时分析每个文件,但没有程序加速,它需要的时间比串行版本的代码要多。

代码下方:

void searchPatternInFile(char *fileName, char *inputPattern){

size_t      bufsize = 32;   
char        *tmpLineLeft, *tmpLineBeforePattern, *patFoundPointer;
FILE        *fp;
int         lineNum = 0;
int     patPos  = 0;
bool        found   = false;


fp=fopen(fileName, "r");

if(fp == NULL)
{
    perror(fileName);
    exit(1);
}

while(!feof(fp))
{
    ++lineNum;

    tmpLineLeft = (char *)malloc(bufsize * sizeof(char));

    if( tmpLineLeft == NULL)
    {
        perror("Błąd przy próbie dynamicznej alokacji pamięci!");
        exit(1);
    }

    getline(&tmpLineLeft, &bufsize, fp);


    patFoundPointer = strstr(tmpLineLeft, inputPattern);

    found = patFoundPointer != NULL;

    if(found)
    {       
        printf(BLU "ĹšcieĹĽka:%s\n" MAG "Numer linii:%d\t" RESET, fileName, lineNum);
    }

    while(patFoundPointer)
    {  

        patPos = patFoundPointer - tmpLineLeft;

        tmpLineBeforePattern = (char *)malloc((patPos +1) * sizeof(char));

        if( tmpLineBeforePattern == NULL)
        {
            perror("Błąd przy próbie dynamicznej alokacji pamięci!");
            exit(1);
        }

        strncpy(tmpLineBeforePattern, tmpLineLeft, patPos);

        tmpLineBeforePattern[patPos] = '\0';

        strcpy(tmpLineLeft, &tmpLineLeft[patPos + strlen(inputPattern)]);

        printf("%s", tmpLineBeforePattern);
        printf(YEL "%s" RESET, inputPattern);

        patFoundPointer = strstr(tmpLineLeft, inputPattern);

        free(tmpLineBeforePattern);

    }
    if(found)
    {
        printf("%s\n", tmpLineLeft);
    }
    free(tmpLineLeft);
}
fclose(fp);
}


int main(int argc, char *argv[])
{   
const int   patternLen = 10;
char        pattern[patternLen + 1];
//char      fileName[FILENAME_MAX];
int     numOfFilesToSearch = argc - 2;
float       elapsed;


double start_time = omp_get_wtime();        

if(argc < 3)
{       
    printf("Niepoprawne parametry!\n");
    exit(1);
}
else 
{
    strncpy(pattern, argv[1], patternLen);
    pattern[patternLen] = '\0';     
}

int i;
#pragma omp parallel for        
for(i = 1; i <= numOfFilesToSearch; ++i)
{
    char localFileName[FILENAME_MAX];

    strcpy(localFileName, argv[i+1]);

    searchPatternInFile(localFileName, pattern);    
}


double end_time = omp_get_wtime(); 

elapsed = end_time - start_time;

printf("Czas wykonania programu: %f s\n", elapsed);


return 0;

}

0 个答案:

没有答案