所以我对C上的多线程有一种非常奇怪的行为,这种行为只发生在我的Macbook上。我基本上做矩阵乘法,由于某种原因,2个线程明显快于1(duh),但3个线程不仅慢于2而是慢于1!我获得的3个线程的值对于任何其他线程都保持稳定。
在Linux服务器上我已经运行了这个,我得到了稳定的更快的运行时间,最多4个线程,然后它关闭。这是时间和我的一些代码。
Linux的:
Threads Seconds
1 6.304504
2 3.334440 No error.
3 2.447981 No error.
4 2.057114 No error.
5 2.121951 No error.
6 2.131267 No error.
7 2.187199 No error.
8 2.304021 No error.
9 2.179180 No error.
10 2.168700 No error.
OSX:
Threads Seconds
1 1.228449
2 0.791477 No error.
3 1.799167 No error.
4 1.870556 No error.
5 2.004676 No error.
6 1.934047 No error.
内存分配:
int ** create_array(int rows, int columns){
int **a;
a = malloc(rows * sizeof(int *));
int i;
for (i = 0; i < rows; i++)
a[i] = malloc(columns * sizeof(int));
return a;
}
线程创建:
void multiply_array(int**left, int**right, int**output, int threads){
pthread_t *thread_list;
thread_list = malloc(threads * sizeof(pthread_t));
x = 0;
y = 0;
int i;
for(i = 0; i < threads; i++){
pthread_attr_t attr;
/* get the default attribute */
pthread_attr_init(&attr);
/* create a new thread */
pthread_create(&thread_list[i], &attr, worker, NULL);
}
for(i = 0; i < threads; i++){
pthread_join(thread_list[i], NULL);
}
free(thread_list);
}
编辑:
以下评论的更多信息:
我将Matrix A(1200 * 1000)乘以Matrix B(1000 * 500)得到Matrix C(1200 * 500)。
在2.7 GHz Intel i7上运行(8核?)
编译命令:gcc Lab4.c -O1 -Wall -o Lab4 -lpthread
我无法发布工作人员代码,因为这是针对某个班级而我担心在线发布我的解决方案可能会有问题。但实质上,每个工作者都会获取输出数组的一个单元格,并计算应该在数组中的值。所有数组都是全局变量。我添加了一个调试语句,看起来每个线程都得到了相当均匀的记录分发:
5 1.856814 No error.
Thread exiting after processing 100001 records.
Thread exiting after processing 99994 records.
Thread exiting after processing 100002 records.
Thread exiting after processing 100009 records.
Thread exiting after processing 99994 records.
Thread exiting after processing 100000 records.
答案 0 :(得分:1)
我似乎成了false sharing的受害者。我选择使用全局变量来跟踪线程在矩阵中的位置,因此它们随机迭代遍历数组。拆分每个线程要解决的块会使事情变得更快,尽管我仍然没有得到更多线程的提升。
在Linux服务器上:
Threads Seconds
1 6.400566
2 3.253767 No error.
3 2.235638 No error.
4 1.982804 No error.
5 1.803468 No error.
6 1.493511 No error.
7 1.445361 No error.
8 1.308549 No error.
9 1.336010 No error.
在Macbook Pro(Intel i7)上:
Threads Seconds
1 1.214193
2 0.584341 No error.
3 0.414696 No error.
4 0.500751 No error.
5 0.493094 No error.
6 0.612082 No error.
7 0.479231 No error.
8 0.539043 No error.
9 0.539322 No error.