我试图在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]++;
}
}
}
答案 0 :(得分:3)
创建线程的过程占用了大量资源。因此,如果您创建线程只是为了进行一些简单的计算,那么最终可能会比单线程应用程序的性能更差。多线程只在性能方面有所回报,其中有大量的处理工作需要完成,并且存在“并行化”程序的情况,例如“通过这个庞大的数组并对每个项目执行大量计算” ”
请注意,您使程序多线程的原因通常与性能无关。最常见的原因是您希望一次执行多个操作,例如让一个线程处理GUI而另一个线程执行计算而不冻结GUI。