我正在CentOS 7服务器上测试带有gcc(GCC)4.8.3 20140911的Linux上的pthread并行代码。在Linux上GCC/pthread并行代码比简单的单线程代码慢得多
单线程版本是简单的,它是用来初始化一个10000 * 10000矩阵:
int main(int argc)
{
int size = 10000;
int * r = (int*)malloc(size * size * sizeof(int));
for (int i=0; i<size; i++) {
for (int j=0; j<size; j++) {
r[i * size + j] = rand();
}
}
free(r);
}
然后我想看看并行代码可以提高性能:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
int size = 10000;
void *SetOdd(void *param)
{
printf("Enter odd\n");
int * r = (int*)param;
for (int i=0; i<size; i+=2) {
for (int j=0; j<size; j++) {
r[i * size + j] = rand();
}
}
printf("Exit Odd\n");
pthread_exit(NULL);
return 0;
}
void *SetEven(void *param)
{
printf("Enter Even\n");
int * r = (int*)param;
for (int i=1; i<size; i+=2) {
for (int j=0; j<size; j++) {
r[i * size + j] = rand();
}
}
printf("Exit Even\n");
pthread_exit(NULL);
return 0;
}
int main(int argc)
{
printf("running in thread\n");
pthread_t threads[2];
int * r = (int*)malloc(size * size * sizeof(int));
int rc0 = pthread_create(&threads[0], NULL, SetOdd, (void *)r);
int rc1 = pthread_create(&threads[1], NULL, SetEven, (void *)r);
for(int t=0; t<2; t++) {
void* status;
int rc = pthread_join(threads[t], &status);
if (rc) {
printf("ERROR; return code from pthread_join() is %d\n", rc);
exit(-1);
}
printf("Completed join with thread %d status= %ld\n",t, (long)status);
}
free(r);
return 0;
}
的简单的代码运行约0.8秒,而多线程版本运行约10秒!!!!!!!
我在4核心服务器上运行。但为什么多线程版本太慢?
该代码可能会阻止'rand()'中的互斥量,因为它保证了产生的数字的一定序列。您需要学习使用分析器(例如gprof)来真正识别瓶颈。 – Dummy00001
'valgrind --tool = callgrind'和'gprof'(在应用程序的静态版本上)都清楚地显示了瓶颈所在。它确实在'rand()'中。干杯。 – Dummy00001