用openmp并行读入文本文件,运行时间比串行还长

发布于 2022-09-04 01:04:18 字数 1143 浏览 25 评论 0

想用openmp实现字符串匹配算法的并行,发现c语言读入文本时间较长,想优化一下,但是用openmp并行读入文件比原来的串行程序时间还长,十分不解,求指导。
用的4线程,并行时间0.43s,串行时间0.39s。运行都没问题的
在mac上跑的,线程数在编译的时候在terminal输进去,测试了没问题的

long thread_count=strtol(argv[1],NULL,10);
     printf("%d\n",thread_count);
    FILE *fp=fopen("/Users/liuchong/Desktop/Harry Potter.txt","r");   
    fseek(fp, 0L, SEEK_END);
    long SIZE = ftell(fp);
    fseek(fp, 0L, SEEK_SET);
    char *text = (char*) malloc(sizeof(char) * SIZE);

    if(!fp)
    {
        printf("can't open file\n");
        return -1;
    } 
    # pragma omp parallel for num_threads(thread_count) 
  
   for (int i=0; i<thread_count;i++)
    {
        fseek(fp,i*SIZE/thread_count,SEEK_SET);
       
        long local_test=i*(SIZE/thread_count);
       
             for(local_test;local_test<((i+1)*SIZE/thread_count);local_test++)
        {
            fscanf(fp,"%c",&text[local_test]);
        }        
    }   
    
    
//串行程序
/* 
    for(long j=0;j<SIZE;j++)
    //while(!feof(fp))
    {
        fscanf(fp,"%c",&text[test]);
        test++;
           
        //printf("%s",text);
    
    }
  */  

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

俏︾媚 2022-09-11 01:04:18

其他的就不看了,单独看这里

for(long j=0;j<SIZE;j++)
{
    fscanf(fp,"%c",&text[test]);
    test++;
}

你希望的是这一段代码能够并行运行,以便加快读取速度。
在这里达不到这个目的,原因我不敢妄下断言。
这里使用了fscanf,在编译的时候,如果编译的是多线程版本的程序,这个函数是会加锁的保证其线程安全的。
如果编译的不是多线程程序,那么不会加锁。这个在gcc中是这样的,VS我想应该也是。加锁和解锁都需要时间,所以会慢也是正常的。

撩起发的微风 2022-09-11 01:04:18

你的线程呢?

音盲 2022-09-11 01:04:18

omp_get_wtime用这个函数来记录时间。
包含#include <omp.h>

double time_sss = omp_get_wtime(); 这样再试试。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文