我创建了一个矩阵乘法程序,一个是串行的,另一个是使用pthreads的。我需要比较他们的运行时间。我的序列码需要大约16秒来计算1000x1000矩阵乘法,我用秒表检查它,它应该是它应该是。另一方面,当我运行我的pthreads矩阵乘法程序时,我得到了大约22-23秒的打印结果,但结果在终端上打印的速度要快得多。我还使用我的秒表来检查输出运行时间所需的时间,它大约是6秒钟,但打印时间约为23秒。我想还有其他方法可以检查pthread程序的运行时间。您可以在下面找到我的pthreads代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
#include <assert.h>
int SIZE, NTHREADS;
int **A, **B, **C;
void init()
{
int i, j;
A = (int**)malloc(SIZE * sizeof(int *));
for(i = 0; i < SIZE; i++)
A[i] = malloc(SIZE * sizeof(int));
B = (int**)malloc(SIZE * sizeof(int *));
for(i = 0; i < SIZE; i++)
B[i] = malloc(SIZE * sizeof(int));
C = (int**)malloc(SIZE * sizeof(int *));
for(i = 0; i < SIZE; i++)
C[i] = malloc(SIZE * sizeof(int));
srand(time(NULL));
for(i = 0; i < SIZE; i++) {
for(j = 0; j < SIZE; j++) {
A[i][j] = rand()%100;
B[i][j] = rand()%100;
}
}
}
void mm(int tid)
{
int i, j, k;
int start = tid * SIZE/NTHREADS;
int end = (tid+1) * (SIZE/NTHREADS) - 1;
for(i = start; i <= end; i++) {
for(j = 0; j < SIZE; j++) {
C[i][j] = 0;
for(k = 0; k < SIZE; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
void *worker(void *arg)
{
int tid = (int)arg;
mm(tid);
}
int main(int argc, char* argv[])
{
pthread_t* threads;
int rc, i;
if(argc != 3)
{
printf("Usage: %s <size_of_square_matrix> <number_of_threads>\n", argv[0]);
exit(1);
}
SIZE = atoi(argv[1]);
NTHREADS = atoi(argv[2]);
init();
threads = (pthread_t*)malloc(NTHREADS * sizeof(pthread_t));
clock_t begin, end;
double time_spent;
begin = clock();
for(i = 0; i < NTHREADS; i++) {
rc = pthread_create(&threads[i], NULL, worker, (void *)i);
assert(rc == 0);
}
for(i = 0; i < NTHREADS; i++) {
rc = pthread_join(threads[i], NULL);
assert(rc == 0);
}
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Elapsed time: %.2lf seconds.\n", time_spent);
for(i = 0; i < SIZE; i++)
free((void *)A[i]);
free((void *)A);
for(i = 0; i < SIZE; i++)
free((void *)B[i]);
free((void *)B);
for(i = 0; i < SIZE; i++)
free((void *)C[i]);
free((void *)C);
free(threads);
return 0;
}
答案 0 :(得分:2)
这是你获得CPU时间的方法,而不是如何获得已经过去的时钟时间。为此,您需要使用time
(只有第二个粒度)或clock_gettime
CLOCK_MONOTONIC
选项,这是首选。您需要链接POSIX实时扩展(-lrt)。
struct timespec begin, end;
double elapsed;
clock_gettime(CLOCK_MONOTONIC, &begin);
// spawn threads to do work here
clock_gettime(CLOCK_MONOTONIC, &end);
elapsed = end.tv_sec - begin.tv_sec;
elapsed += (end.tv_nsec - begin.tv_nsec) / 1000000000.0;
在你的例子中,我猜你使用了大约4个线程?然后CPU时间(CPU 1中使用的时间+ CPU 2中使用的时间+ CPU 3中使用的时间+ CPU 4中使用的时间)应该是绝对时间的大约4倍(6对23秒)。
答案 1 :(得分:1)
我所知道的最简单的方法是使用OpenMP。与-fopenmp链接
#include <omp.h>
int main() {
double dtime = omp_get_wtime(); //value in seconds
//run some code
dtime = omp_get_wtime() - dtime;
}
请注意,1000x1000矩阵乘法的16秒非常慢。我的代码在我的i7-2600k上以4.33 GHz的速度在0.03秒内完成1056x1056甚至不到最大理论速度的30%。