0

我正在尝试在 C 中设计一个小程序。我正在使用 openMP 来并行化部分代码,它逐行读取文件,将许多行读取存储在数组缓冲区中并调用一个函数现在“等待”10 微秒。这是我的代码。我基本上想并行执行该特定功能。即缓冲区的数据在填满后立即分派到单个线程,然后第二个缓冲区填满到第二个线程,依此类推...。这可能不同步,也不需要在这个阶段。

int count = 0;             //global
char *array_buffer[8];     //global

char process(int lent)
{
    int row,col;
    #pragma omp single
        for(row = 0; row<count; row++)
    {
        usleep(10); 
                //printf("%s", array_buffer[row]);

                //may be executing another function call from here .... ? 

                free(array_buffer[row]);
    }
    return 1;
}


void line(char *line_char)
{

    int lent = strlen(line_char);

    array_buffer[count] = malloc((lent + 1)*sizeof(char));
    strcpy(array_buffer[count], line_char); 

    #pragma omp parallel
    if (count == 8)
    {
    int returning, returned_all = 0;
    returning = process(lent); //function call, waits for 10 microseconds and returns 1 as o/p

    #pragma omp single
    count = 0;

    #pragma omp atomic
    returned_all = returned_all + returning;
    }

    count++;
}



int main(int argc,char **argv)
{

    FILE *fp = fopen(argv[1], "r");
    if(fp == NULL )
    {
        printf("Couldn't open file %s",argv[1]);
    }
    char buff[512];

    while (fgets(buff, 512, fp) != NULL )
    {
        line(buff);             /*sending out an array having one line*/
    }

    return 0;
}

这显然不起作用。我知道我搞砸了 omp single,但 omp atomic 似乎是正确的。有任何帮助、建议或更正以使其正常工作吗?

4

1 回答 1

2

我什至不知道从哪里开始。

您的代码有很多错误。

第一:你知道你的并行代码只会在每 8 行运行一次吗?

if (count == 8)

您在并行块内分配returned_all,这意味着每个线程都将拥有自己的私有副本returned_all

你的使用#pragma omp single完全不合适。#omp parallel即使编译,在块之外使用它也没有效果......

在并行函数内部调用free(array_buffer[row])会给你带来很多麻烦,比如双重释放。

如果您想逐行并行处理文件,我建议您使用 stdio 库中的默认锁定并执行类似的操作

#pragma omp parallel
{
    // each thread get's it's own private buffer
    char buff[512];
    while (fgets(buff, 512, fp)) {
        // process the line
    }
}
于 2013-07-08T12:28:44.227 回答