如何有效地在n个线程中索引非平方积矩阵?

时间:2018-10-04 21:23:46

标签: java multithreading matrix

假设我想使用多线程将i×j矩阵与j×k矩阵相乘以生成i×k矩阵,其中i,j和k未知。执行矩阵乘法的任务线程数n也未知。如何有效地确定每个线程负责计算的乘积矩阵的索引?

作为参考,我最初的方法是将元素总数(i和k的乘积)除以线程数(n),以获得每个线程负责的索引数。创建每个线程时,它将其编号(即线程0、1、2 ...)传递给乘法方法,以确定起始索引和终止索引,就好像矩阵是一维的(即[0] [0] = 0,[0] [1] = 1,[0] [2] = 2 ...)。最后,该方法将迭代每个一维索引,将其转换为二维索引,并确定每个索引处的值。

这种方法有效,但是我注意到,在Java中,它不能加快矩阵乘法。实际上,随着矩阵大小的增加,它通常会减慢该过程。假设我已经用Java正确实现了线程,为什么会这样呢?我怀疑这与确定二维索引所需的计算有关(在我的情况下,每个索引需要两个额外的算术运算),但我也知道实现线程会带来一定程度的开销。

如果以上描述不清楚,这是我的实现方式:

public synchronized void perform(int id) {
    int first = id * NUM_OPS;
    int last = first + NUM_OPS - 1;

    if(id == NUM_THREADS - 1)
        last += (i * k) % NUM_THREADS;

    if(last >= i * k)
        return;

    for(int curr = first; curr <= last; curr++) {
        int p = curr / k;
        int r = curr % k;
        for(int q = 0; q < j; q++)
            C[p][r] += A[p][q] * B[q][r];
    }
}

0 个答案:

没有答案