我是新来的,而且我在编程方面也相对较新。我用C编写了一个程序,我需要使用pthread来加速它。我尝试使用OpenMP这样做,但我不知道如何调试它。此外,我需要找出使用pthreads和时间的程序是否更快,但我不知道如何在我的代码中写这个。这是我的代码
enter code here
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <pthread.h>
#define NTHREADS 2
#define FYLLO(komvos) ((komvos) * 2 + 1)
long factorial(long);
void heap_function (int [], int, int );
void make_heap(long [], int );
void pop_heap(long [], int );
struct thread_data
{
long int n;
long int k;
long *b;
};
main()
{
long int n,k,c,fact=1;
long *a,*b,*d,p[k];
int i,j,rc;
int q[]={2,3,4,5,6,7,8,9,12,13,14,15,16};
pthread_t thread[NTHREADS];
struct thread_data threada;
for(i=0;i<NTHREADS;i++)
{
threada.n=n;
threada.k=k;
threada.b=b;
pthread_create (&thread[i], NULL, (void *)&threada);
}
for (i=0; i<NTHREADS; i++)
rc = pthread_join (thread[i], NULL);
for(i=0;i<13;i++)
{
k=pow(2,q[i])-1;
if(a=(long*)malloc(i*sizeof(long))==NULL);
{
printf("Den yparxei diathesimi mnimi gia desmeusi\n");
exit(1);
}
a[i]=k;
for(a[0];a[13];a[i]++)
{
n=(pow(2,q[i]))*k;
if(d=(long*)malloc((i*i)*sizeof(long))==NULL);
{
printf("Den yparxei diathesimi mnimi gia desmeusi\n");
exit(1);
}
d[i]=n;
}
c=(factorial(n))/((factorial(k))*(factorial(n-k)));
}
if(b=(long*)malloc(((i*i)+i)*sizeof(long))==NULL)
{
printf("Den yparxei diathesimi mnimi gia desmeusi\n");
exit(1);
}
for(i=0;i<13;i++)
{
b[i]=a[i];
}
for(i=13;i<182;i++) /* Gia i=13 exoume i^2=169 kai i^2+i=182*/
{
b[i]=d[i];
}
long heap[sizeof(b)];
make_heap( heap, sizeof(b) );
printf("To heap einai:\n");
for ( i = sizeof(b); i >=0; i-- )
{
printf( "%d ", heap[0] );
pop_heap( heap, i );
}
for(i=(n-k);i<=n;i++)
for(j=0;j<k;j++)
{
p[j]=heap[i];
printf("Ta %d mikrotera stoixeia eina ta %ld\n",k,p[j]);
}
free((void*)b);
getch();
}
long factorial(long n)
{
int a;
long result=1;
for( a=1;a<=n;a++ )
result=result*a;
return(result);
}
void heap_function( int a[], int i, int n )
{
while ( FYLLO( i ) < n ) /* Vazoume sto heap ta stoixeia san ypodentra */
{
int fyllo = FYLLO( i );
if ( fyllo + 1 < n && a[fyllo] < a[fyllo + 1] ) /* Dialegoume to maegalytero apo ta dyo paidia komvous */
++fyllo;
if ( a[i] < a[fyllo] ) /* Metaferoume to megalytero komvo sti riza */
{
int k = a[i];
a[i] = a[fyllo];
a[fyllo] = k;
}
++i; /* Synexizoume ston epomeno komvo */
}
}
void make_heap( long a[], int n ) /*Dhmioyrgoume ti sinartisi make_heap gia na mporesoume na valoume ta
stoixeia pou dwsame mesa sto heap kai na ta ta3inomisoume*/
{
int i = n / 2;
while ( i-- > 0 )
heap_function( a, i, n );
}
void pop_heap( long heap[], int n ) /*Dhmiourgoume ti sinartisi pop_heap gia na mporesoume na e3agoume
ta stoixeia apo to heap apo to megalytero sto mikrotero*/
{
long k = heap[0];
heap[0] = heap[n];
heap[n] = k;
heap_function( heap, 0, n ); /*Afou emfanistei to prwto stoixeio kaloume ti sinartisi heap_function
gia na ta3inomisei ta stoixeia pou menoun sto heap*/
}
很抱歉我搞乱了邮件,但是现在我开始使用它了
答案 0 :(得分:5)
添加线程可能不会加速您的程序,它可以让您将工作组织成可以看起来并行运行的执行单元(并且在多核系统上,通常可以并行运行)。如果你不在多核系统上,如果你的一个或多个线程必须阻止等待慢速输入,你仍然可以获得优势,因为其他线程可以继续运行;这可能会也可能不会给你更快的运行时间,具体取决于你的实际程序。
调试线程通常比调试单个线程更困难,如何做到这一点归结为您可用的工具。如果您的调试器无法让您更轻松地完成工作,我建议您首先使程序串行运行 - 仍然使用线程模型将其分解,但让每个运行的代码在主线程中运行并让它运行直到完成,如果你的模型允许这样做。许多线程应用程序不能这样写,因为线程在运行时期间相互依赖,但它只取决于你正在做什么。
现在根据您的具体情况 - 当您不知道如何游泳时,您将潜入深渊。我建议你首先学习使用线程,而不是为什么需要它们的复杂性,否则你会使问题变得比它需要的更复杂。 http://cs.gmu.edu/~white/CS571/Examples/Pthread/create.c有一个简单的例子可以开始使用。特别注意pthread_create()
电话的参数,并与你所做的比较;你的代码缺少第3个参数 - 作为线程运行的函数。你似乎根本没有这样的功能,相反你似乎相信调用pthread_create()
之后的代码是并行运行的。这就是fork()
的工作原理,但这是非常不同的。
这应该足以让你入门。 http://cs.gmu.edu/~white/CS571/Examples/pthread_examples.html还有其他示例,谷歌的“pthread教程”可能会有所帮助。