在处理器0中创建矩阵并将其分散到其他处理器。矩阵是对称密集矩阵。这就是它在处理器0中初始化的原因。
以这种方式创建矩阵:
A=malloc(sizeof(double)*N*N);
for (i=0; i<N; i++)
for(j=0; j<N; j++)
A(i,j)=rand()%10; // The code will be changed.
A(i,j)定义为:
#define A(i,j) A[i*N+j]
和N必须为100,000才能测试算法。
这里的问题是:如果N = 100,000,那么所需的内存大约是76GB。你有什么建议存储A矩阵?
PS:当N <20.000并且群集是一个分散的内存系统(每个处理器2GB RAM)时,算法运行良好
答案 0 :(得分:2)
如果您在具有足够虚拟地址空间的POSIX系统上进行编程(实际上这意味着64位系统),您可以使用mmap()
。
创建所需大小的匿名映射(这将是交换支持,这意味着您将需要至少76GB的交换),或者创建所需大小的真实文件并映射它。
文件支持的解决方案的优势在于,如果您的群集具有共享文件系统,则无需将矩阵显式传输到每个处理器 - 您可以在创建它之后简单地msync()
它,然后映射每个处理器上的右侧区域。
答案 1 :(得分:2)
如果您按照评论中的说明进行缩放测试,那么Oli Charlesworth是完全正确的;你做的任何事情都会使这与苹果到橙子的比较,因为你的节点没有76GB可供使用。哪个好;使用MPI的一个重要原因是解决一个节点上无法解决的问题。但是,通过尝试将76GB的数据发送到一个处理器上,你所做的比较是没有任何意义的。正如Oli Charlesworth和caf提到的,通过各种方法你可以使用磁盘而不是RAM,但是你的1处理器答案将不会直接与你从大量节点获得的适合RAM的数字相比,所以你要做很多工作来获得一个实际上并不意味着什么的数字。
如果你想在这类问题上扩展结果,你可以从问题 适合的最少数量的节点开始,然后在越来越多的处理器上获取数据,或者你做{ {3}},而不是weak scaling测试 - 在扩大处理器数量的同时保持每处理器工作量不变,而不是总工作量不变。
顺便说一句,无论你进行测量,如果像Oli Charlesworth所建议的那样,你会让每个处理器生成自己的数据,而不是因为排名为0来生成矩阵的串行瓶颈,那么你最终会得到更好的结果。然后让所有处理器接收他们的部件。
答案 2 :(得分:1)
如果您可以切换到C ++,您可以查看STXXL,这是一个专门为大型数据集设计的STL实现,具有透明的磁盘支持等。