我正在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