0

在处理器 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)时,算法工作得很好

4

3 回答 3

2

如果您在具有足够虚拟地址空间的 POSIX 系统上编程(实际上这意味着 64 位系统),您可以使用mmap().

要么创建一个所需大小的匿名映射(这将是交换支持的,这意味着您将需要至少 76GB 的交换空间),或者创建一个所需大小的真实文件并映射它。

文件支持的解决方案的优点是,如果您的集群有一个共享文件系统,您不需要显式地将矩阵传输到每个处理器 - 您可以msync()在创建它之后简单地传输它,然后在每个处理器上映射正确的区域。

于 2011-05-01T22:41:25.037 回答
2

如评论中所述,如果您这样做是为了进行缩放测试,那么 Oli Charlesworth 是完全正确的;您所做的任何事情都会使这成为苹果与橘子的比较,因为您的节点没有 76GB 可用空间。这很好;使用 MPI 的一个重要原因是解决一个节点无法解决的问题。但是通过尝试将 76GB 的数据硬塞到一个处理器上,您所做的比较将没有任何意义。正如 Oli Charlesworth 和 caf 所提到的,通过各种方法,您可以使用磁盘而不是 RAM,但是您的 1 个处理器的答案将无法直接与您从大量节点获得的适合 RAM 的数字相提并论,所以你会做很多工作来得到一个实际上没有任何意义的数字。

如果您想要此类问题的扩展结果,您可以从问题适合的最少节点数开始并在越来越多的处理器上获取数据,或者您进行弱扩展,而不是强扩展测试——您在增加处理器数量的同时保持每个处理器的工作量不变,而不是总工作量保持不变。

顺便说一句,无论您如何进行测量,如果像 Oli Charlesworth 建议的那样,您让每个处理器生成自己的数据,而不是通过让秩 0 生成矩阵然后有一个串行瓶颈,那么您最终会得到更好的结果所有的处理器都会收到他们的零件。

于 2011-05-02T01:59:41.807 回答
1

如果您可以切换到 C++,您可能会考虑STXXL,这是一个专门为大型数据集设计的 STL 实现,具有透明的磁盘支持等。

于 2011-05-01T21:31:56.173 回答