0

有两组矩阵,即 A(1 500 个矩阵)和 B(150 000 个矩阵)。

对于集合 A 中的每个矩阵 a,我遍历 B 中的所有元素 b 检查 a 和 b 的条件(如果某些矩阵 b 为真,我停止迭代并返回 true。但如果在迭代整个集合 B 后未找到匹配项, 然后返回 false)。

我的问题是如何使用 Java 使这个程序并行?

我知道矩阵集非常大(我上面发布的元素数量只是例如,在现实生活中它们会更大)。如何正确地进行所有计算?创建 1 5000 个线程并进行所有计算实际上并不是一个好主意。将承担所有计算工作的最佳线程数量是多少?

4

2 回答 2

1

我认为您可能正在寻找ForkJoinPool

我将尝试整理一个适合您情况的示例。本质上,您应该将过程分成几部分,也许在您的情况下,每个部分使用一个 forka并遍历该 fork 中的所有bs。池会自动充分利用您的处理器。

这里有一个非常简单的例子。

于 2013-08-09T20:44:32.407 回答
1

如您所说,您可能需要检查所有对,并且没有启发式方法可以帮助我们检查检查顺序,因此如果检查不需要任何导致 CPU 浪费的 I/O 或某事,如果您有 4 个示例4核心,请创建4线程(0-3) 和线程 i 负责检查a(4k+i)和每个b. 并且在每次检查每个线程之前,您必须检查是否找到了真正的对,这可以通过扩展类中的静态变量来完成Thread

public class Worker extends Thread{
    static int found=0;
    /**
     * @param args the command line arguments
     */
    List<Matrix> a;
    List<Matrix> b;
    int myid;
    int coreNumber;
    Worker(List<Matrix> a, List<Matrix> b, int myid,int coreNumber){
        this.a=a;
        this.b=b;
        this.myid=myid;
        this.coreNumber=coreNumber;

    }

    @Override
    public void run() {
        for(int i=myid;i<a.size();i+=coreNumber){
            for(int j=0;j<b.size();j++){
                if(found==1){
                    return;
                }
                if(check(a.get(i),b.get(j))){
                    found=1;
                    return;
                }
            }
        }
    }

}

您需要等到所有线程停止工作。

于 2013-08-09T18:57:31.540 回答