使用 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

.

  1. 连载版(不使用线程)

    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];
    }
    
  2. 使用线程(线程数: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; 
     }
    
  3. 主要功能

     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;
    }
    

由于两个项目,线程程序运行速度较慢。

  1. 线程需要额外的时间来进行上下文切换

  2. 一个线程的creation/destruction需要时间

这两项是主要的 'extra' 时间占用者。

此外,您应该注意该程序是 CPU 绑定的,而不是 I/O 绑定的。 I/O 绑定程序将从线程中受益,但是; CPU 由于所有上下文切换、线程的创建和线程的销毁,绑定程序(显着)延迟。

注意:通过使用 'thread pool'.

可以轻松地使程序更快