【问题标题】:No significant performance improvement in multi threading多线程没有显着的性能提升
【发布时间】:2017-11-01 15:54:18
【问题描述】:

我试图在 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]++;
        }
    }
}

【问题讨论】:

  • 你创建了多少线程?并且不要在计时中包含打印输出(它可能相对较慢并且会影响基准测试结果)。
  • 我在这里做一个学术项目,我们研究线程数从 2 到 64 时的性能。关于打印输出我删除了它。谢谢。
  • 不清楚 - 您为测试传递了哪些参数?
  • '我们研究线程数从 2 到 64 时的性能'很好,因为线程并不总是,(它应该是'几乎没有'),在这个'不断创建,加入、终止”的方式,在从此类研究中得出结论时应该小心。
  • 我们传递矩阵的大小和线程数来解决矩阵中随机数的分布。但我发现问题在于这里的资源创建。

标签: c linux multithreading


【解决方案1】:

创建线程的过程会占用大量资源。因此,如果您创建线程只是为了进行一些琐碎的计算,您最终可能会获得比单线程应用程序更差的性能。多线程仅在需要完成大量处理工作并且需要“并行化”程序的情况下(例如“遍历这个巨大的数组并为每个项目执行大量计算”)在性能方面带来回报”。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多