我正在尝试用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单身,但omp原子似乎是正确的。任何帮助,建议或更正,以使这项工作?
答案 0 :(得分:2)
我甚至不知道从哪里开始。
您的代码存在很多错误。
首先:你知道你的并行代码只会在每第8行运行吗?
if (count == 8)
您在并行块中分配returned_all
,这意味着每个线程都拥有它自己的returned_all
私有副本。
您对#pragma omp single
的使用完全不合适。如果它在#omp parallel
块之外使用它甚至无法编译......
在并行函数中调用free(array_buffer[row])
会让你在使用double free等时遇到很多麻烦。
如果你想并行处理一个文件,我建议你使用stdio库中的默认锁定并执行类似
的操作#pragma omp parallel
{
// each thread get's it's own private buffer
char buff[512];
while (fgets(buff, 512, fp)) {
// process the line
}
}