3
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
/*任务4(必做):编译、测试和运行示例程序psum64.c
|
||||
/*
|
||||
任务4(必做):编译、测试和运行示例程序psum64.c
|
||||
1)测量线程数为1、2、4、8、16时程序的执行时间,计算加速比和效率,并做出解释。
|
||||
2)改写该程序psum64.c,保存为task64.c,实现计算02+12+… +(n-1)2功能。
|
||||
2)改写该程序psum64.c,保存为task64.c,实现计算0²+1²+…+(n-1)²功能。
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -19,50 +20,50 @@ double get_time()
|
||||
return tv.tv_sec + tv.tv_usec / 1000000.0;
|
||||
}
|
||||
|
||||
|
||||
unsigned long long psum64[MAXTHREADS];
|
||||
unsigned long long nelems_per_thread;
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
unsigned long long i,nelems,log_nelems,nthreads,result = 0;
|
||||
unsigned long long i, nelems, log_nelems, nthreads, result = 0;
|
||||
pthread_t tid[MAXTHREADS];
|
||||
int myid[MAXTHREADS];
|
||||
|
||||
if(argc != 3)
|
||||
if (argc != 3)
|
||||
{
|
||||
printf("Usage: %s <nthreads> <log_nelems>\n",argv[0]);
|
||||
printf("Usage: %s <nthreads> <log_nelems>\n", argv[0]);
|
||||
exit(0);
|
||||
}
|
||||
nthreads = atoi(argv[1]);
|
||||
log_nelems = atoi(argv[2]);
|
||||
nelems = (1LL << log_nelems);
|
||||
nelems_per_thread = nelems / nthreads;
|
||||
|
||||
|
||||
double t_start = get_time();
|
||||
for ( i = 0; i < nthreads; i++)
|
||||
for (i = 0; i < nthreads; i++)
|
||||
{
|
||||
myid[i] = i;
|
||||
pthread_create(&tid[i],NULL,sum,&myid[i]);
|
||||
pthread_create(&tid[i], NULL, sum, &myid[i]);
|
||||
}
|
||||
|
||||
for ( i = 0; i < nthreads; i++)
|
||||
for (i = 0; i < nthreads; i++)
|
||||
{
|
||||
pthread_join(tid[i],NULL);
|
||||
pthread_join(tid[i], NULL);
|
||||
}
|
||||
|
||||
for ( i = 0; i < nthreads; i++)
|
||||
for (i = 0; i < nthreads; i++)
|
||||
{
|
||||
result += psum64[i];
|
||||
}
|
||||
|
||||
if (result == (nelems*(nelems-1)*(2*nelems-1))/6)
|
||||
|
||||
/* 验证公式: 0²+1²+...+(n-1)² = (n-1)*n*(2n-1)/6 */
|
||||
if (result == (nelems * (nelems - 1) * (2 * nelems - 1)) / 6)
|
||||
{
|
||||
printf("Correct result: %llu\n",result);
|
||||
printf("Correct result: %llu\n", result);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Wrong result: %llu\n",result);
|
||||
printf("Wrong result: %llu\n", result);
|
||||
}
|
||||
double t_end = get_time();
|
||||
printf("Time taken: %f seconds\n", t_end - t_start);
|
||||
@@ -70,14 +71,12 @@ int main(int argc, char **argv)
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void *sum(void *vargp)
|
||||
{
|
||||
int myid = *((int *)vargp);
|
||||
unsigned long long begin = myid * nelems_per_thread;
|
||||
unsigned long long end = begin + nelems_per_thread;
|
||||
unsigned long long i,lsum=0;
|
||||
unsigned long long i, lsum = 0;
|
||||
|
||||
for (i = begin; i < end; i++)
|
||||
{
|
||||
@@ -86,4 +85,4 @@ void *sum(void *vargp)
|
||||
|
||||
psum64[myid] = lsum;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user