使用pthread库,我已经编写了一些矩阵乘法的代码。
AFAIK,使用线程的程序要比不使用线程的更快。但是,与我的预期不同。。。结果(运行时间(完全相反,不使用线程的程序比线程程序快得多。发生了什么。。我不明白为什么会发生这种事。
下面的执行时间。。
Time ( # of thread: 4 )
0.000451 sec
Time ( no thread )
0.000002 sec
我已经将这两个版本编码在一个文件中(.c(
但pThread总是比顺序差
。
串行版本(不使用线程(
void serial_multi() { for (int i = 0; i < MAX; i++) for(int j = 0; j < MAX; j++) for(int k = 0; k < MAX; k++) _matC[i][j] += matA[i][k] * matB[k][j]; }
使用线程(线程数:4(
int step_i = 0; void* multi(void* arg) { int core = step_i++; // each thread computes 1/4th of matrix multiplication for (int i = core * MAX / 4; i < (core + 1) * MAX/4; i++) for(int j = 0; j < MAX; j++) for(int k = 0; k < MAX; k++) matC[i][j] += matA[i][k] * matB[k][j]; return NULL; }
主要功能
int main() { printf("PID: %dn",getpid()); // generating random values in matA and matB for (int i = 0; i < MAX; i++){ for (int j = 0; j < MAX; j++){ matA[i][j] = rand() % 10; matB[i][j] = rand() % 10; } } //cout << endl << "Matrix A" << endl; for (int i = 0; i < MAX; i++){ for (int j = 0; j < MAX; j++) printf("%d ",matA[i][j]); printf("n"); } //cout << endl << "Matrix B" << endl; for (int i = 0; i < MAX; i++){ for (int j = 0; j < MAX; j++) printf("%d ",matB[i][j]); printf("n"); } // declaring 4 threads pthread_t threads[MAX_THREAD]; // creating 4 threads, each evaluating its own part // Time Estimation clock_t start = clock(); for (int i = 0; i < MAX_THREAD; i++){ pthread_create(&threads[i], NULL, multi, NULL); } // joining and waiting for all threads to complete for (int i = 0; i < MAX_THREAD; i++) pthread_join(threads[i], NULL); clock_t end = clock(); printf("Time: %lfn", (double)(end-start)/CLOCKS_PER_SEC); // displaying the result matrix //cout << endl << "Multiplication of A and B" << endl; for (int i = 0; i < MAX; i++){ for (int j = 0; j < MAX; j++) printf("%d ",matC[i][j]); printf("n"); } return 0; }
由于有两项,线程程序运行速度较慢。
-
线程为上下文切换花费额外的时间
-
线程的创建/销毁需要时间
这两项是主要的"额外"时间。
另外,您应该注意,这个程序是CPU绑定的,而不是I/O绑定的。I/O绑定程序将受益于线程,但是;由于所有上下文切换、线程的创建和线程的破坏,绑定CPU的程序(显著(延迟。
注意:通过使用"线程池",程序可以很容易地变得更快。