多线程没有显着的性能提升

时间:2017-11-01 07:47:04

标签: c linux multithreading

我试图在NxN矩阵中找到变量的分布。矩阵由1到10的数字随机填充。

我正在创建一些线程(来自cmdline输入)并为每个线程分配一些行(均匀分布到线程)以查找分布。但我没有看到单线程应用程序的性能提升。这是预期的结果还是我在这里做错了什么。

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include "timing.h"


struct threadInput{
int** inputArray;
int* distribution;
int size;
};

int sizeofArray;
int matrixDistribution[10] = {0};
pthread_mutex_t count_mutex;

void* findDistribution(void* distribution);

int main(int argc,char** argv){
    if(argc < 3){
        printf("%s \n","please enter the size of NxN matrix and number of threads. ex: ./part3parallel.out ");
        exit(0);
    }

    timing_start();
    int numThreads;
    sizeofArray= atoi(argv[1]);
    numThreads = atoi(argv[2]);

    /*generate matrix */
    int array[sizeofArray][sizeofArray];
    srand(time(NULL));
    int i,j;
    for(i = 0;i<sizeofArray;i++){
        for(j=0;j<sizeofArray;j++){
            array[i][j] = (rand() % 10) + 1;
         }
     }

    /* split the array between threads */
    int divideArraybythreads[numThreads];
    memset(divideArraybythreads, 0, sizeof divideArraybythreads);
    int threadCounter = 0;

    for(i=0;i<sizeofArray ;i++){
        divideArraybythreads[threadCounter] = divideArraybythreads[threadCounter] + 1;
        ++threadCounter;
        if(threadCounter > numThreads - 1)
            threadCounter = 0;
    }
    /*****************************/

    struct threadInput ti[numThreads];
    pthread_t threadIds[numThreads];
    int arrayCounter = 0;

    for(i=0;i<numThreads;i++){
       if(divideArraybythreads[i] == 0)
            continue;

        ti[i].inputArray = (int **)malloc(divideArraybythreads[i] * sizeof(int *));
        int j;
        for (j=0; j<divideArraybythreads[i] ; j++){
            ti[i].inputArray[j] = (int *)malloc(sizeofArray * sizeof(int));
            ti[i].inputArray[j] = *(array + arrayCounter);
            arrayCounter++;
        }
        ti[i].size = divideArraybythreads[i];
        ti[i].distribution = (int *)malloc(10 * sizeof(int));

        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_create(&threadIds[i],&attr, findDistribution,&ti[i]);
    }

    for(i=0;i<numThreads;i++){
        if(divideArraybythreads[i] == 0)
            continue;
        pthread_join(threadIds[i],NULL);
    }

    for(i=0;i<numThreads;i++){
        if(divideArraybythreads[i] == 0)
            continue;
        for(j=0;j<10;j++)
        {
            matrixDistribution[j]  =  matrixDistribution[j]  + ti[i].distribution[j];
        }   
    }

    for(i=0;i<10;i++){
        printf("%d \n",matrixDistribution[i]);
    }

    timing_stop();

    printf("%lli \n",get_timing());

    return 0;
}


void* findDistribution(void* distribution){
    struct threadInput *arr = (struct threadInput*) distribution;

    int i,j;
    for(i=0;i<arr->size;i++){
        for(j=0;j<sizeofArray;j++){
            arr->distribution[arr->inputArray[i][j] - 1]++;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

创建线程的过程占用了大量资源。因此,如果您创建线程只是为了进行一些简单的计算,那么最终可能会比单线程应用程序的性能更差。多线程只在性能方面有所回报,其中有大量的处理工作需要完成,并且存在“并行化”程序的情况,例如“通过这个庞大的数组并对每个项目执行大量计算” ”

请注意,您使程序多线程的原因通常与性能无关。最常见的原因是您希望一次执行多个操作,例如让一个线程处理GUI而另一个线程执行计算而不冻结GUI。