- 论坛徽章:
- 0
|
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
{
char str[8];
struct barrel * next;
}barrel_t;
barrel_t* B[96];
barrel_t* init_barrel()
{
barrel_t *head;
head=(barrel_t *)malloc(sizeof(barrel_t));
strcpy(head->str,"start");
head->next=NULL;
return head;
}
barrel_t* insert_barrel(barrel_t* head,char* insertstr)
{
barrel_t *p,*q;
q = head;
p = (barrel_t *)malloc(sizeof(barrel_t));
strcpy(p->str,insertstr);
if (head==NULL)
{
head = p;p->next=NULL;
return head;
}
while (q->next!=NULL)
{
q=q->next;
}
q->next = p;
p->next = NULL;
return head;
}
barrel_t * pop_one(barrel_t *head)
{
barrel_t *p ,*q;
p=head;
if (head==NULL||head->next==NULL)
{
return NULL;
}
q = p->next;
p->next = q->next;
return q;
}
void free_barrel(barrel_t *head)
{
barrel_t * p,* q;
p=head;
if (p==NULL)
{
// printf("List is null!\n");
}
while (p!=NULL)
{
q = p;
p = p->next;
free(q);
}
}
int bucket(char **a,int j)
{
int i=0;
for (i=0;i<8;i++)
{
// printf("a[%d][%d] = %c one!\n",i,j,a[j]);
insert_barrel(B[a[i][j]-32],a[i]);
}
// printf("\n\n");
return 0;
}
int main()
{
int nthreads = 4;
omp_set_num_threads(nthreads);
long start_time,end_time;
struct timeval start_time_tv,end_time_tv;
struct timezone tz;
char *a[8] =
{
"H@skell",
"surVEYs",
"sysTEMS",
"HASKELL",
"Surveys",
"1234567",
"SURveys",
"systEMS"
};
int i=0;
int j;
int k=0;
gettimeofday (&start_time_tv, &tz);
// start_time=start_time_tv.tv_sec*1000000+start_time_tv.tv_usec;
// printf("start_time = %ld\n",start_time_tv.tv_sec);
#pragma omp parallel
{
int id = omp_get_thread_num();
#pragma omp for
for (i=0;i<96;i++)
{
B[i] = init_barrel();
printf("Hello World from thread = %d", id);
printf(" with %d threads\n",omp_get_num_threads());
}
}
// #pragma omp parallel for
for(j=6;j>=0;j--)
{
i=0;
bucket(a,j);
for (k=0;k<96;k++)
{
while (B[k]->next!=NULL)
{
//printf("k = %d \n",k);
barrel_t * p;
p=pop_one(B[k]);
a[i++] = p->str;
}
}
}
//#pragma omp parallel for
for (i=0;i<96;i++)
{
free_barrel(B[k]);
}
gettimeofday (&end_time_tv , &tz);
// end_time=end_time_tv.tv_sec*1000000+end_time_tv.tv_usec;
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) );
for (i=0;i<8;i++)
{
printf("%s\n",a[i]);
}
}
|
我这边出现的问题就是
不使用openmp时 只用20ms左右
在我使用openmp功能时 时间反而远远超过,
而且线程数设置越多时间消耗越多
按理说应该事先多线程啊? 怎么时间消耗更多呢? |
最佳答案
查看完整内容
谁也没说使用多线程性能一定会提高。你有几个CPU?几个核?
|