使用 pThread 比 Sequential 更糟糕
Using pThread is worse than Sequential
使用 pthread 库,我已经编写了一些矩阵乘法代码。
据我所知,使用线程的程序比不使用线程的程序要快得多。但是,与我的预期不同......结果(经过时间)完全相反,不使用线程的程序比线程程序快得多。发生了什么..我找不到为什么会这样。
下面的执行时间..
Time ( # of thread: 4 )
0.000451 sec
Time ( no thread )
0.000002 sec
我已经将这两个版本编码在一个文件中 (.c)
but always pThread is worse than sequential
.
连载版(不使用线程)
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: %d\n",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: %lf\n", (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;
}
由于两个项目,线程程序运行速度较慢。
线程需要额外的时间来进行上下文切换
一个线程的creation/destruction需要时间
这两项是主要的 'extra' 时间占用者。
此外,您应该注意该程序是 CPU 绑定的,而不是 I/O 绑定的。 I/O 绑定程序将从线程中受益,但是; CPU 由于所有上下文切换、线程的创建和线程的销毁,绑定程序(显着)延迟。
注意:通过使用 'thread pool'.
可以轻松地使程序更快
使用 pthread 库,我已经编写了一些矩阵乘法代码。
据我所知,使用线程的程序比不使用线程的程序要快得多。但是,与我的预期不同......结果(经过时间)完全相反,不使用线程的程序比线程程序快得多。发生了什么..我找不到为什么会这样。
下面的执行时间..
Time ( # of thread: 4 )
0.000451 sec
Time ( no thread )
0.000002 sec
我已经将这两个版本编码在一个文件中 (.c)
but always pThread is worse than sequential
.
连载版(不使用线程)
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: %d\n",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: %lf\n", (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; }
由于两个项目,线程程序运行速度较慢。
线程需要额外的时间来进行上下文切换
一个线程的creation/destruction需要时间
这两项是主要的 'extra' 时间占用者。
此外,您应该注意该程序是 CPU 绑定的,而不是 I/O 绑定的。 I/O 绑定程序将从线程中受益,但是; CPU 由于所有上下文切换、线程的创建和线程的销毁,绑定程序(显着)延迟。
注意:通过使用 'thread pool'.
可以轻松地使程序更快