Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使高性能矩阵算法实现分布式?_Java_Performance_Matrix_Distributed Computing - Fatal编程技术网

Java 如何使高性能矩阵算法实现分布式?

Java 如何使高性能矩阵算法实现分布式?,java,performance,matrix,distributed-computing,Java,Performance,Matrix,Distributed Computing,我有一个多线程程序,其中内核的数量是速度的瓶颈。几乎所有内存都由三角形矩阵使用 long[][] matrix; 实际上,矩阵的每个元素都是一个恒定的位数(256k),所以在实现级别上它是一个3d矩阵(所以我可以使用一个基元类型) 根据输入的大小,我可以使矩阵最大为500GB,但我正在使用小输入测试4GB。不过,有趣的情况是500GB以上 我有一个整数对的阻塞队列,它是用一些整数对初始化的 每个线程在伪代码中执行以下操作: while (true) { pair = queue.pol

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

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.5s,但对于较大的输入,评估时间更长。我们在这里看到,对于一些cpu周期,我们只需要矩阵的2行和2列。但是知道http请求的速度,使其分布式似乎没有任何意义。我不确定内存管理是如何完成的,在这种情况下,我从未实现过分布式算法。比如说,如果我们需要4行和4列总共2GB来计算f,那么使用gpu有意义吗?我认为与主机RAM交换内存会花费太长时间。一般来说,高性能分布式算法如何使其内存与主内存同步?

可以使用

long[][] m = new long[][n];
for (int i = 0; i < n; ++i) {
    m[i] = new long[i + 1]; // or n - i 
}
(另一种技术涉及稀疏矩阵。)

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

例如,您可以使用内存映射的
长缓冲区
,甚至可以使用内存映射文件:适合分布式访问

如果您只考虑一台计算机、多个处理器,那么一个Java8LongStream并行流就很简单了

分布式计算通常不应该使用HTTP,因为它(仍然)很慢,而且无论如何都会转向HTTPS。 A我认为,您还不想使用现有的框架,请选择带有超时的
Socket
s。您需要为客户机-服务器交换(防火墙)打开端口。你的while循环,拉动,被更智能的东西取代


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

三角形矩阵可以用

long[][] m = new long[][n];
for (int i = 0; i < n; ++i) {
    m[i] = new long[i + 1]; // or n - i 
}
(另一种技术涉及稀疏矩阵。)

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

例如,您可以使用内存映射的
长缓冲区
,甚至可以使用内存映射文件:适合分布式访问

如果您只考虑一台计算机、多个处理器,那么一个Java8LongStream并行流就很简单了

分布式计算通常不应该使用HTTP,因为它(仍然)很慢,而且无论如何都会转向HTTPS。 A我认为,您还不想使用现有的框架,请选择带有超时的
Socket
s。您需要为客户机-服务器交换(防火墙)打开端口。你的while循环,拉动,被更智能的东西取代


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

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

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


这样,你可能想考虑切换到MPI。

< P>你用java来标记你的问题。但老实说,我建议使用一些完全为分布式编程而开发的库

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


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

在<代码> f>代码>中是否存在任何并行性?如果是这样的话,将矩阵分布到第三维可能是有意义的。对于通信,HTTP在普通套接字上提供的功能不多。但传输2GB可能需要0.5秒或更长时间。您的基于队列的循环是严格顺序的,但是下一个条目的处理可能只稍微依赖于前一对(如果选择了不同的行/列),并且可能有一种并行完成大部分工作的方法
++++
这是一个例子,知道X可能会有所帮助。
f
本身是否存在并行性?如果是这样的话,将矩阵分布到第三维可能是有意义的。对于通信,HTTP在普通套接字上提供的功能不多。但传输2GB可能需要0.5秒或更长时间。您的基于队列的循环是严格顺序的,但是下一个条目的处理可能只稍微依赖于前一对(如果选择了不同的行/列),并且可能有一种并行完成大部分工作的方法<代码>++++这是一个很好的例子,知道X可能会有所帮助。