【发布时间】: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