在处理器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必须是100000才能测试算法。
这里的问题是:如果n=100000,则所需的内存大约为76GB。你建议如何存储A矩阵?
PS:当N
最佳答案
如果您这样做(如注释中所述)是为了做一个缩放测试,那么Oli Charlesworth是完全正确的;您所做的任何事情都将使这成为一个苹果与橙子的比较,因为您的节点没有76GB可供使用。这很好;使用MPI的一个重要原因是要解决无法在一个节点上安装的问题。但是,试图将76GB的数据压缩到一个处理器上,这样做的比较没有任何意义。正如Oli Charlesworth和caf所提到的,通过各种方法,您可以使用磁盘而不是RAM,但是这样一来,您的单处理器答案将无法直接与您从更多节点获得的RAM数字相比较,因此您将需要大量工作来获得一个实际上没有任何意义的数字。
如果您希望缩放此类问题的结果,可以从问题适合的最低节点数开始,并以不断增加的处理器数获取数据,也可以执行weak scaling,而不是strong scaling测试—在缩放处理器数的同时保持每个处理器的工作不变,而不是总工作不变。
顺便说一句,不管您如何进行测量,如果像Oli Charlesworth建议的那样,让每个进程生成自己的数据,而不是让秩为0生成矩阵,然后让所有处理器接收它们的部件,那么您最终会得到更好的结果。
关于c - 内存管理消除高斯,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5851500/