免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2488 | 回复: 5
打印 上一主题 下一主题

[C] 请教openmp 问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-15 17:36 |只看该作者 |倒序浏览
10可用积分
第一次用openmp  做个并行多线程编程。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
#include <omp.h>

typedef struct barrel
{
&nbsp;&nbsp;&nbsp;&nbsp;char str[8];
&nbsp;&nbsp;&nbsp;&nbsp;struct barrel * next;
}barrel_t;

barrel_t* B[96];

barrel_t* init_barrel()
{
&nbsp;&nbsp;&nbsp;&nbsp;barrel_t *head;
&nbsp;&nbsp;&nbsp;&nbsp;head=(barrel_t *)malloc(sizeof(barrel_t));
&nbsp;&nbsp;&nbsp;&nbsp;strcpy(head->str,"start");
&nbsp;&nbsp;&nbsp;&nbsp;head->next=NULL;
&nbsp;&nbsp;&nbsp;&nbsp;return head;
}

barrel_t* insert_barrel(barrel_t* head,char* insertstr)
{
&nbsp;&nbsp;&nbsp;&nbsp;barrel_t *p,*q;
&nbsp;&nbsp;&nbsp;&nbsp;q = head;
&nbsp;&nbsp;&nbsp;&nbsp;p = (barrel_t *)malloc(sizeof(barrel_t));
&nbsp;&nbsp;&nbsp;&nbsp;strcpy(p->str,insertstr);&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if (head==NULL)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head = p;p->next=NULL;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return head;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;while (q->next!=NULL)
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q=q->next;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;q->next = p;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;p->next = NULL;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;return head;
}

barrel_t * pop_one(barrel_t *head)
{
&nbsp;&nbsp;&nbsp;&nbsp;barrel_t *p ,*q;
&nbsp;&nbsp;&nbsp;&nbsp;p=head;
&nbsp;&nbsp;&nbsp;&nbsp;if (head==NULL||head->next==NULL)
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NULL;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;q = p->next;
&nbsp;&nbsp;&nbsp;&nbsp;p->next = q->next;
&nbsp;&nbsp;&nbsp;&nbsp;return q;
}

void free_barrel(barrel_t *head)
{
&nbsp;&nbsp;&nbsp;&nbsp;barrel_t * p,* q;
&nbsp;&nbsp;&nbsp;&nbsp;p=head;
&nbsp;&nbsp;&nbsp;&nbsp;if (p==NULL)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;printf("List is null!\n");&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;while (p!=NULL)
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q = p;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p->next;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(q);
&nbsp;&nbsp;&nbsp;&nbsp;}
}

int bucket(char **a,int j)
{
&nbsp;&nbsp;&nbsp;&nbsp;int i=0;
&nbsp;&nbsp;&nbsp;&nbsp;for (i=0;i<8;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;printf("a[%d][%d] = %c  one!\n",i,j,a[j]);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert_barrel(B[a[i][j]-32],a[i]);
&nbsp;&nbsp;&nbsp;&nbsp;}
//&nbsp;&nbsp;&nbsp;&nbsp;printf("\n\n");

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;int nthreads = 4;
&nbsp;&nbsp;&nbsp;&nbsp;omp_set_num_threads(nthreads);

&nbsp;&nbsp;&nbsp;&nbsp;long start_time,end_time;
&nbsp;&nbsp;&nbsp;&nbsp;struct timeval start_time_tv,end_time_tv;
&nbsp;&nbsp;&nbsp;&nbsp;struct timezone tz;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;char *a[8] =
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"H@skell",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"surVEYs",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"sysTEMS",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"HASKELL",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Surveys",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"1234567",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SURveys",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"systEMS"
&nbsp;&nbsp;&nbsp;&nbsp;};
&nbsp;&nbsp;&nbsp;&nbsp;int i=0;
&nbsp;&nbsp;&nbsp;&nbsp;int j;
&nbsp;&nbsp;&nbsp;&nbsp;int k=0;
&nbsp;&nbsp;&nbsp;&nbsp;gettimeofday (&start_time_tv, &tz);
//&nbsp;&nbsp;&nbsp;&nbsp;start_time=start_time_tv.tv_sec*1000000+start_time_tv.tv_usec;

//&nbsp;&nbsp;&nbsp;&nbsp;printf("start_time = %ld\n",start_time_tv.tv_sec);

&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;#pragma omp parallel
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int id = omp_get_thread_num();
&nbsp;&nbsp;&nbsp;&nbsp;#pragma omp for
&nbsp;&nbsp;&nbsp;&nbsp;for (i=0;i<96;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B[i] =  init_barrel();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Hello World from thread = %d", id);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(" with %d threads\n",omp_get_num_threads());
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

// #pragma omp parallel for

&nbsp;&nbsp;&nbsp;&nbsp;for(j=6;j>=0;j--)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bucket(a,j);&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (k=0;k<96;k++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (B[k]->next!=NULL)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf("k = %d \n",k);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;barrel_t * p;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=pop_one(B[k]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[i++] = p->str;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//#pragma omp parallel for

&nbsp;&nbsp;&nbsp;&nbsp;for (i=0;i<96;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free_barrel(B[k]);
&nbsp;&nbsp;&nbsp;&nbsp;}


&nbsp;&nbsp;&nbsp;&nbsp;gettimeofday (&end_time_tv , &tz);
//&nbsp;&nbsp;&nbsp;&nbsp;end_time=end_time_tv.tv_sec*1000000+end_time_tv.tv_usec;


&nbsp;&nbsp;&nbsp;&nbsp;printf("It takes %ld ms\n",(end_time_tv.tv_sec - start_time_tv.tv_sec)*1000000 + (end_time_tv.tv_usec - start_time_tv.tv_usec) );

&nbsp;&nbsp;&nbsp;&nbsp;for (i=0;i<8;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",a[i]);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;


}


我这边出现的问题就是
不使用openmp时 只用20ms左右
在我使用openmp功能时 时间反而远远超过,
而且线程数设置越多时间消耗越多
按理说应该事先多线程啊? 怎么时间消耗更多呢?

最佳答案

查看完整内容

谁也没说使用多线程性能一定会提高。你有几个CPU?几个核?

论坛徽章:
0
2 [报告]
发表于 2009-04-15 17:36 |只看该作者
原帖由 xp5211314 于 2009-4-15 18:05 发表
to 3#  ziggler

文档网上很多,不过还是谢谢
我就是想问一下,为什么我的时间在使用openmp后反而增加了


谁也没说使用多线程性能一定会提高。
你有几个CPU?几个核?

论坛徽章:
0
3 [报告]
发表于 2009-04-15 17:45 |只看该作者
有人做个openmp吗?  
编译选项要加一个 -fopenmp

论坛徽章:
0
4 [报告]
发表于 2009-04-15 17:56 |只看该作者

论坛徽章:
0
5 [报告]
发表于 2009-04-15 18:05 |只看该作者
to 3#  ziggler

文档网上很多,不过还是谢谢
我就是想问一下,为什么我的时间在使用openmp后反而增加了

论坛徽章:
0
6 [报告]
发表于 2009-04-16 09:30 |只看该作者
单酷睿2 E7300双核啊?


应该能采用多线程提高性能吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP