如何分发高性能矩阵算法实现?

时间:2017-06-25 11:33:57

标签: java performance matrix distributed-computing

我有一个多线程程序,核心数量是速度的瓶颈。几乎所有内存都由三角矩阵使用。

long[][] matrix;

实际上矩阵的每个元素都是一个常数位(256k),所以在实现层面它是一个3d矩阵(所以我可以使用一个原始类型)。

根据输入的大小,我可以将矩阵设置为500GB,但是我使用小输入进行测试时需要4GB。有趣的案例是500GB +。

我有一对成对的阻塞队列,用一些对初始化。

每个线程在伪代码中执行以下操作:

while (true) {
    pair = queue.poll()
    if (pair==null) break;
    row1 = matrix.rows[pair[1]];
    row2 = matrix.rows[pair[2]];
    column1 = matrix.columns[pair[1]];
    column2 = matrix.columns[pair[2]];
    (row1',row2',column1',column2') = f(row1, row2, column1, column2);
    matrix.rows[pair[1]] = row1 & row1';
    matrix.rows[pair[2]] = row2 & row2';
    matrix.columns[pair[1]] = column1 & column1';
    matrix.columns[pair[2]] = column2 & column2';
    if (...) {
        queue.enqueue(...)
    }
}

对f的每次评估约为0.5秒,但对于较大的输入则会更长。我们在这里看到,对于一些cpu循环,我们只需要2行和2列矩阵。但是要知道例如http请求的速度,使这种分布变得毫无意义。我不确定如何完成内存管理是这样的,我从来没有实现过分布式算法。假设我们需要为4行和4列总共2 GB来评估f,那么使用gpu' s是否有意义?我认为与主机RAM交换内存需要太长时间。一般来说,高性能分布式算法如何将其内存与主内存同步?

2 个答案:

答案 0 :(得分:0)

三角形矩阵可以用

完成
long[][] m = new long[][n];
for (int i = 0; i < n; ++i) {
    m[i] = new long[i + 1]; // or n - i 
}

更容易制作线性数组和

int index(int row, int column)

(另一种技术涉及稀疏矩阵。)

您正在对同一矩阵进行更改(原位)。这给算法提出了一些要求。

例如,您可以使用内存映射 LongBuffer,甚至可以使用内存映射文件:非常适合分布式访问。

如果您只是考虑一台计算机,多个处理器, java 8 LongStream parallelStream将很简单。

分布式计算通常不应该使用HTTP,因为它仍然很慢,并且无论如何都会漂移到HTTPS。 我认为,你现在不想使用现有的框架,只需要超时Socket s。您需要打开用于客户端 - 服务器交换(防火墙)的端口。你的while循环,拉动,被更聪明的东西取代。

这一切都不是答案,但可能会列出一些攻击点。

答案 1 :(得分:0)

您使用“java”标记了您的问题。但说实话,我建议使用一些专为分布式编程而开发的库。

最受欢迎(非常复杂)的一个是MPI。它可以与C / C ++或Fortran一起使用。 MPI实现通常具有通信例程的良好渐近复杂度,即。例如,1)您不需要自己实现通信原语,2)可以期望它们尽可能快地运行(特别是当您传输GB数据时,如果收集广播的复杂度为O(n)而不是O(log(n)))。

因此,您可能需要考虑切换到MPI。