c-使用pThread比Sequential更糟糕



使用pthread库,我已经编写了一些矩阵乘法的代码。

AFAIK,使用线程的程序要比不使用线程的更快。但是,与我的预期不同。。。结果(运行时间(完全相反,不使用线程的程序比线程程序快得多。发生了什么。。我不明白为什么会发生这种事。

下面的执行时间。。

Time ( # of thread: 4 )
0.000451 sec
Time ( no thread )
0.000002 sec

我已经将这两个版本编码在一个文件中(.c(

但pThread总是比顺序差

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

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

  1. 线程为上下文切换花费额外的时间

  2. 线程的创建/销毁需要时间

这两项是主要的"额外"时间。

另外,您应该注意,这个程序是CPU绑定的,而不是I/O绑定的。I/O绑定程序将受益于线程,但是;由于所有上下文切换、线程的创建和线程的破坏,绑定CPU的程序(显著(延迟。

注意:通过使用"线程池",程序可以很容易地变得更快。

相关内容

  • 没有找到相关文章

最新更新