使用C在OSX上进行奇怪的线程计时

时间:2013-11-20 16:38:25

标签: c multithreading macos pthreads

所以我对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.

1 个答案:

答案 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.